数据结构
作者:互联网
一. 概述
数据结构是相互之间存在一种或多种特定关系的数据元素集合
主要包括三个方面:逻辑结构、存储结构和数据的运算
算法的设计取决于逻辑结构,而其实现依赖于存储结构
逻辑结构
- 线性结构:线性表
- 非线性结构:集合、树、图
存储结构
- 顺序存储:逻辑上相邻的元素,物理位置上也相邻,存储单位地址连续
- 链式存储:借助元素存储地址的指针来表示逻辑关系,不要求物理上相邻
- 索引存储:存储元素信息同时建立索引表,索引表每项称为索引项,方便快速检索,缺点是占用额外空间
- 散列存储:根据关键字直接计算出存储地址,又称哈希存储
二. 线性表
1. 线性表的定义和基本操作
线性表是具有相同数据类型的n个数据元素的有限序列
除第一个元素外,有且只有一个直接前驱,除最后一个元素外,有且只有一个后继
基本操作:初始化、增删改查、返回表长、回收线性表
2. 线性表的顺序表示
顺序存储的线性表称为顺序表,用一组地址连续的存储空间一次存储线性表中元素
顺序表的特点是逻辑顺序和物理顺序相同,可以根据地址的相对位置直接访问,实现随机存储
插入、删除、查找的时间复杂度均为O(n)
顺序表应用题
3. 线性表的链式表示
3.1. 单链表
线性表的链式存储又称单链表,通过一组任意的存储单元来存储线性表中元素
每个链表节点,除存放元素自身信息,还存放一个指向后继的指针,查找特定节点时,需要从表头开始遍历
为了操作上的方便,一般使用一个头结点,其指针指向线性表第一个元素
(这样既统一了第一个位置和其他位置的操作,又统一了空表和非空表的操作)
头插法:将节点插到最前端,得到链表顺序与插入顺序相反
尾插法:记录尾指针,从最后端插入,并更新尾指针,注意最后尾指针悬空
其他操作有按序号查找、按值查找、插入到指定位置、删除节点、求表长
拓展:前插操作和删除节点操作可以通过交换数据域来灵活实现
3.2 双链表
双链表节点中存在两个指针,分别指向前驱和后继
//p节点后插入s
s->next = p->next;
p->next->prior = s;
s->prior = p;
p->next = s;
//p节点后删除q
p->next = q->next'
q->next->prior = p;
free(q);
3.3 循环单链表、循环双链表、静态链表
循环单链表判空条件为头结点的指针是否等于头指针,有时不设头指针而仅设尾指针
循环双链表与单链表不同在于其头结点的前驱还要指向尾节点,为空表时,头结点的前驱和后继都为自己
静态链表借助数组来描述链式存储,节点也有数据域和指针域,其指针域存储节点的相对地址(游标),以next==-1作为结束的标志
链表应用题
三. 栈和队列
1. 栈
栈是只允许在一端进行插入或删除的线性表,$ n个不同元素入栈,出栈的排列有\frac{1}{n+1}C^{n}_{2n} $
采用顺序存储的栈称为顺序栈,采用连续存储单元存放自栈底到栈顶的数据
栈空条件:s.top==-1,栈满条件:s.top = MaxSize-1
此时入栈操作先移动指针,再存放数据,出栈操作先出数据,再移动指针
- 共享栈:top0=-1时0号栈空,top1=MaxSize时1号栈空,top1-top0==1时栈满
- 链栈:便于共享空间,不存在栈满情况,所有操作在表头进行
2. 队列
队列只允许在队尾一段插入,另一端队头删除
2.1 顺序存储
队列的顺序实现同样是分配一块连续的存储单元,附设两个指针
初始q.front=0、q.rear=0
循环队列:可以看出q.rear==Maxsize时队列并不一定满,可以通过取余操作将数组假定成环状空间
出队:q.front=(q.front+1)%MaxSize
入队: q.rear=(q.rear+1)%MaxSize
判断队空队满有三种方式
- 牺牲一个单元:(q.rear+1)%MaxSize == q.front队满,q.rear = q.front队空
- 记录元素个数:q.size=0和q.size=MaxSize
- 新增tag标志:若因删除操作导致两指针相等,则队空,因插入导致相等,则队满
2.2 链式存储和双端队列
队列的链式存储实际上是一个带有队头指针和队尾指针的单链表
使用头结点进行插入和删除的统一操作,当删除节点为尾结点时,置空,其余操作和单链表一致
双端队列指允许在两端进行入队和出队的队列,除此之外还有
输入受限的的双端队列:另一端只允许删除
输出受限的双端队列:另一端只允许插入
2.3 矩阵压缩
二维数组转一维数组的映射计算
对称矩阵的压缩
三角矩阵的压缩
稀疏矩阵的数组存储和十字链表存储
四. 串
详见串的模式匹配
ababaaababaa的next数组(-1.0.0.1.2.3.1.1.2.3.4.5)
ababaaababaa的nextval数组(0.1.0.1.0.4.2.1.0.1.0.4)
五.树与二叉树
标签:存储,线性表,队列,next,数据结构,节点,指针 来源: https://www.cnblogs.com/929code/p/16574499.html