数据结构¶
逻辑结构¶
数据与数据之间的逻辑关系。
1、集合结构¶
2、线性结构¶
一对一的关系。线性表(链表),队列,栈,数组,字符串(N个字符组成)。
线性表¶
线性关系,相当于一条线。
对于⾮空的线性表和线性结构,其特点如下:
- 存在唯⼀的⼀个被称作”第⼀个”的数据元素;
- 存在唯⼀的⼀个被称作”最后⼀个"的数据元素
- 除第⼀个之外,结构中的每个数据元素均有⼀个前驱
- 除最后⼀个之外,结构中的每个数据元素都有⼀个后继.
线性表的顺序存储¶
清空线性表时不需要清空元素,只需要设置length = 0。
优点:
- 无需为线性表汇中的逻辑关系增加额外的空间
- 可以快速的获取表中合法位置的元素
缺点:
- 插入和删除操作需要移动大量元素
- 当线性表长度变化较大时难以确定存储空间的容量
线性表的链式存储¶
优点:
- 无需一次性定制链表的容量
- 插入和删除无需移动数据元素
缺点:
- 数据元素必须保存后继元素的位置信息
- 获取指定数据的元素操作需要顺序访问之前的元素
- 插入删除都需要找到前面的节点,根据前面的节点的next找到下一个节点。
删除结点的时候把结点地址甩出去,底层库不释放,生命周期不归底层库管理,因为不知道上层业务在堆还是栈,需要上层业务自己释放指针,否则有内存泄漏。
指针指向谁就把谁的地址赋给指针。
链表的操作逻辑和辅助指针变量之间的关系。
链表的设计与实现¶
- 线性表的顺序存储
seqList
- 线性表的链式存储
头指针跳几次,查找
- 单向链表linklist
- 单循环链表circlelist
- 双向链表Dlinklist
-
双向循环链表
-
栈
-
seqstack(顺序存储)
- linkstack(链式存储)
-
栈的应用(中缀表达式,后缀表达式)
-
队列
-
seqqueue(顺序存储)
-
linkqueue(链式存储)
-
思想
-
链表是数据结构的基础,栈和队列在整个数据结构中起穿针引线的作用。树中就用到栈。
-
栈和队列是一种特殊线性表
向队列中添加元素 相当于向线性表的尾部添加元素
栈(队列)的item(业务结点)转化成链表的LinkListNode
队列的业务结点的数据结构 模仿链的结构 相当于链表结点中包含栈的业务结点。
typedef struct _tag_LinkQuequeNode
{
LinkListNode node;//链表的结点
void *item; //栈的item
}TLinkQueueNode;
3、树形结构¶
一对多的关系。二叉树,B树,B+树,红黑树,哈夫曼树。
4、图形结构¶
多对多的关系。邻接矩阵,邻接表。
物理结构¶
数据结构最终存储在内存中。
1、顺序存储¶
需要移动元素。
查询比较简单。
2、链式存储¶
不需要提前开辟一段连续的内存空间。
查询的时候需要遍历。