其他分享
首页 > 其他分享> > 数据结构

数据结构

作者:互联网

一. 概述

数据结构是相互之间存在一种或多种特定关系的数据元素集合
主要包括三个方面:逻辑结构、存储结构和数据的运算
算法的设计取决于逻辑结构,而其实现依赖于存储结构
逻辑结构

存储结构

二. 线性表

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
此时入栈操作先移动指针,再存放数据,出栈操作先出数据,再移动指针

2. 队列

队列只允许在队尾一段插入,另一端队头删除

2.1 顺序存储

队列的顺序实现同样是分配一块连续的存储单元,附设两个指针
初始q.front=0、q.rear=0
循环队列:可以看出q.rear==Maxsize时队列并不一定满,可以通过取余操作将数组假定成环状空间
出队:q.front=(q.front+1)%MaxSize
入队: q.rear=(q.rear+1)%MaxSize
判断队空队满有三种方式

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