大话数据结构 第三章 线性表(二) 静态链表、循环链表和双向链表

静态链表(未使用指针)

定义

  • 静态链表:用数组描述的链表
  • 由两个数据域组成:data和cur。data用来存放数据元素,cur用来存放该元素的后继在数组中的下标,即游标。
  • 备用链表:未被使用的数组元素
  • 数组第一个和最后一个元素作为特殊元素处理,不存数据
  • 第一个元素(下标为0的元素):cur存放备用链表的第一个结点的下标
  • 最后一个元素:cur存放第一个有数值的元素的下标

插入操作

  • 需要自己实现结点的申请和释放函数
  • 主要思想是把要插入元素的游标调整至对应位置,而与数据的实际相对地址(下标)无关

删除操作

  • 将删除的位置成为第一个优先空位,把它存入第一个元素的cur中

优缺点

优点

  • 在插入和删除操作时,只需要修改游标,不需要移动元素。

缺点

  • 没有解决连续存储分配带来的表长难以确定的问题
  • 失去了顺序存储结构随机存取的特性

循环链表

定义

  • 循环链表:将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表被称为循环链表

循环链表的合并

  • 存在两个循环链表,尾指针分别为rear A、rear B
  • 需要丢弃rear B 的头结点,具体操作为
  • (rearA->next) 指向 (rearB->next->next)
  • (rearB->next) 指向 (rearA->next)

双向链表

定义

  • 双向链表是在单链表的每个结点中,再设置一个指向其前驱结点的指针域。结点有两个指针域,一个指向直接后继next,一个指向直接前驱prior。

插入操作

  • 假设元素e的结点为s,要插入到结点p和结点p->中:
  • 把p赋值给s的前驱: s->prior = p;
  • 把p->next复制给s的后继:s->next = p->next;
  • 把s赋值给p->next的前驱:p->next ->prior = s;
  • 把s赋值给p的后继:p->next = s;

删除操作

  • 假设在p->next和p->prior之间删除结点p:
  • 把p->next赋值给p->prior的后继:p->prior->next = p->next;
  • 把p->prior赋值给p->next的前驱:p->next->prior = p->prior;
发布了59 篇原创文章 · 获赞 3 · 访问量 1806

猜你喜欢

转载自blog.csdn.net/Felix_hyfy/article/details/98884453