跳转至

数据结构

逻辑结构

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

1、集合结构

2、线性结构

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

线性表

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

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

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

线性表的顺序存储

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

优点:

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

缺点:

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

线性表的链式存储

优点:

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

缺点:

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

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

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

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

链表的设计与实现

  • 线性表的顺序存储

​ seqList

  • 线性表的链式存储

头指针跳几次,查找

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

  5. seqstack(顺序存储)

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

  8. 队列

  9. seqqueue(顺序存储)

  10. linkqueue(链式存储)

  11. 思想

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

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

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

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

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

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

3、树形结构

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

4、图形结构

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

物理结构

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

1、顺序存储

需要移动元素。

查询比较简单。

2、链式存储

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

查询的时候需要遍历。