跳转至

数据结构

逻辑结构

数据与数据之间的逻辑关系。

1、集合结构

2、线性结构

一对一的关系。线性表(链表),队列,栈,数组,字符串(N个字符组成)。

线性表

线性关系,相当于一条线。

对于⾮空的线性表和线性结构,其特点如下:

  • 存在唯⼀的⼀个被称作”第⼀个”的数据元素;
  • 存在唯⼀的⼀个被称作”最后⼀个"的数据元素
  • 除第⼀个之外,结构中的每个数据元素均有⼀个前驱
  • 除最后⼀个之外,结构中的每个数据元素都有⼀个后继.

线性表的顺序存储

清空线性表时不需要清空元素,只需要设置length = 0。

优点:

  • 无需为线性表汇中的逻辑关系增加额外的空间
  • 可以快速的获取表中合法位置的元素

缺点:

  • 插入和删除操作需要移动大量元素
  • 当线性表长度变化较大时难以确定存储空间的容量

线性表的链式存储

优点:

  • 无需一次性定制链表的容量
  • 插入和删除无需移动数据元素

缺点:

  • 数据元素必须保存后继元素的位置信息
  • 获取指定数据的元素操作需要顺序访问之前的元素
  • 插入删除都需要找到前面的节点,根据前面的节点的next找到下一个节点。

删除结点的时候把结点地址甩出去,底层库不释放,生命周期不归底层库管理,因为不知道上层业务在堆还是栈,需要上层业务自己释放指针,否则有内存泄漏。

指针指向谁就把谁的地址赋给指针。

链表的操作逻辑和辅助指针变量之间的关系。

链表的设计与实现

  • 线性表的顺序存储

​ seqList

  • 线性表的链式存储

头指针跳几次,查找

  1. 单向链表linklist
  2. 单循环链表circlelist
  3. 双向链表Dlinklist
  4. 双向循环链表

  5. 栈

  6. seqstack(顺序存储)

  7. linkstack(链式存储)
  8. 栈的应用(中缀表达式,后缀表达式)

  9. 队列

  10. seqqueue(顺序存储)

  11. linkqueue(链式存储)

  12. 思想

  13. 链表是数据结构的基础,栈和队列在整个数据结构中起穿针引线的作用。树中就用到栈。

  14. 栈和队列是一种特殊线性表

向队列中添加元素 相当于向线性表的尾部添加元素

栈(队列)的item(业务结点)转化成链表的LinkListNode

队列的业务结点的数据结构 模仿链的结构 相当于链表结点中包含栈的业务结点。

typedef struct _tag_LinkQuequeNode
{
    LinkListNode    node;//链表的结点
    void *item;  //栈的item
}TLinkQueueNode;

3、树形结构

一对多的关系。二叉树,B树,B+树,红黑树,哈夫曼树。

4、图形结构

多对多的关系。邻接矩阵,邻接表。

物理结构

数据结构最终存储在内存中。

1、顺序存储

需要移动元素。

查询比较简单。

2、链式存储

不需要提前开辟一段连续的内存空间。

查询的时候需要遍历。