线性表的链式存储结构

数据结构系列文章 第三章 循环链表、双向链表


文章目录

  • 线性表的链式存储结构
  • 前言
  • 一、循环链表
    • (一)定义
    • (二)尾指针
  • 二、双向链表
    • (一)定义
    • (二)代码
  • 总结

前言

提示:本系列文章均使用Visual Studio 2019编程,编程语言为c语言。

一、循环链表

(一)定义

将单链表的终端结点的指针端由空指针改为指向头结点,这样就让整个单链表形成一个循环,这时头尾相连的单链表就称为单循环链表,即循环链表,下图的head,即为头指针。


将循环链表和单链表相比较,其实就在循环的判断条件上差别,单链表判断是否为空(p!=null 或 p->null!=null),循环链表是否等于头结点(p!=head 或 p->next!=head)。

(二)尾指针

事实上我们不用头指针,而改用指向终端结点的尾指针来表示循环链表,这样就使查找开始结点和终端结点就很方便。

我们通过一张图,进一步了解其尾指针的作用:

二、双向链表

(一)定义

在单链表结构中,结点只有一个指向后继的指针域next,若要查找某个结点只能顺着单链表寻找它的后继结点,为了能够高效地查找一个结点,我们只需从头指针出发查找其前驱,即我们增加一个指向其直接前驱的指针域prior,这样我们就构成了一个双向链表。其中第一个结点的前趋结点为NULL,最后一个结点的后继结点也为NULL。

指针域(prior) 数据域 指针域(next)

即,数据域为data数据,存储一个数据元素的信息;prior指针域为前驱指针域,用于存储其直接前驱存储地址的信息;next指针域为后继指针域,用于存储其后继存储地址的信息。

(二)代码

  1. 双向单链表的建立
    分别定义数据域,前驱指针域以及后继指针域。
typedef char DataType;
typedef struct dunode
{DataType data;         //数据域struct dunode *prior;   //前驱指针域struct dunode *next;    //后继指针域
}DuLinkList;
  1. 双向单链表的插入
    若要将新结点s(x为其值)插入到双向链表中两个结点o、p之间,即在p结点之前插入结点s,首先我们应该将要插入的新结点s的前驱指针域指向结点p的前一个结点o,将结点o的后继指针域指向要插入的新结点s,然后将结点s的后继指针域指向p结点,并将结点p的前驱指针域指向结点s。
void InsertList(InsertElem *p,DataType x)
{InsertElem *s;s=(InsertElem *)malloc(sizeof(InsertElem));  //生成新结点ss->data=x;s->prior=p->prior;     //也可写成s->prior=op->prior->next=s;      //也可写成o->next=ss->next=p;p->prior=s;            //也可写成o=s
}
  1. 双向链表的删除
    若要删除表中的结点p,我们首先应该将结点p的前一个结点的后继指针域指向结点p的后继指针域,将结点p后一个结点的前驱指针域指向结点p的后继指针域,然后释放结点p的空间。
void DeleteElem(DeleteList *p,DataType *x)
{*x=p->data;p->prior->next=p->next;p->next->prior=p->prior;free(p);
}

总结

以上就是本次的笔记内容,本文介绍了循环链表、双向链表的各项操作,笔记若有错误,还望指出!!!


附:在下一文章会介绍栈的各项操作,持续更新ing……

《数据结构》c语言版学习笔记——其他链表(线性表的链式存储结构Part2)相关推荐

  1. 线性表的链式存储结构以及单链表的插入和删除原理实现

    线性表的链式存储结构 线性表中的每个元素最多只有一个前驱元素和一个后继元素(其逻辑结构),因此可以采用链式存储结构存储. 链表 线性表的链式存储结构称为链表.在链表中每个结点不仅包含有元素本身的信息( ...

  2. 《数据结构》c语言版学习笔记——单链表结构(线性表的链式存储结构Part1)

    线性表的链式存储结构 数据结构系列文章 第二章 单链表结构 文章目录 线性表的链式存储结构 前言 一.单链表的建立 代码 二.单链表的读取 代码 三.单链表的插入 代码 四.单链表的删除 代码 五.单 ...

  3. 数据结构和算法:(3)3.2线性表的链式存储结构

    线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素也就是说你这个可以放在A地点,这个可以放在E地点,A地点和E地点中间可以隔开一个C地点和D地点,这样是允许的),这组存储单元可以存在 ...

  4. 链表list(链式存储结构实现)_5 线性表的链式存储结构

    系列文章参考资料为<大话数据结构>,源码为个人私有,未经允许不得转载 线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,可以使连续的,也可以不连续,也就意味这些元素可以 ...

  5. 从零开始学数据结构和算法(二)线性表的链式存储结构

    链表 链式存储结构 定义 线性表的链式存储结构的特点是用一组任意的存储单元的存储线性表的数据元素,这组存储单元是可以连续的,也可以是不连续的. 种类 结构图 单链表 应用:MessageQueue 插 ...

  6. Python 数据结构 之 线性表 的链式存储结构

    用Python 来实现 C语言中 线性表的链式存储结构. 文章转载请注明:  Python 数据结构 之 线性表 的链式存储结构 代码地址 https://github.com/WenkeZhou/P ...

  7. 【数据结构】CH2 线性表的链式存储结构

    目录 一.链表概述 1.相关定义 二.单链表 1.插入和删除节点的操作 (1)插入结点 (2)删除结点 2.建立单链表 (1)头插法 (2)尾插法 3.线性表基本运算在单链表中的实现 (1)初始化线性 ...

  8. 数据结构-线性表(链式存储结构)

    线性表(链式存储结构) 特点: 用一组任意的存储单元存储线性表的数据结构,这组存储单元可以是连续的,也可以是不连续的. 对数据结构ai来说,除了存储其本身的信息之外,还需存储一个指示其后继的信息(即直 ...

  9. 数据结构开发(5):线性表的链式存储结构

    0.目录 1.线性表的链式存储结构 2.单链表的具体实现 3.顺序表和单链表的对比分析 4.小结 1.线性表的链式存储结构 顺序存储结构线性表的最大问题是: 插入和删除需要移动大量的元素!如何解决? ...

最新文章

  1. 院士论坛|李德仁:测绘遥感与智能驾驶
  2. IntelliJ IDEA打开Maven项目,Spring boot所有依赖红名,不可用
  3. SAP S4HANA custom logic的一个实际例子
  4. java登录界面命令_Java命令行界面(第7部分):JCommander
  5. Linux下MySQL 5.5.11编译安装笔记(待验证)
  6. html瀑布流下拉刷新,瀑布流下拉刷新 - osc_1wnye1so的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. java的smalltalk规则,Smalltalk相当于Java的静态是什么?
  8. 2021 年 338 道架构技术面试大厂高频题汇总(附答案详解)
  9. Linux 内核全系更新 3.6.2、3.5.7 等
  10. svn一些基本操作含义
  11. (新)OpenCV配置visual studio2019详细教程
  12. Axure RP 9 基础教程 元件基础1
  13. IndexError: list index out of range 错误原理及解决方法(python)
  14. unreal无损音乐百度云_Roxette女主唱Marie Fredriksson - Den Standiga Resan 个人瑞典语专辑 [APE]...
  15. 以太坊bloom和logs及代码解析
  16. 麒麟SP1系统非root用户强制修改分辨率,开机自动生效
  17. Gitee 自已提交的代码提交人头像却为他人
  18. input 禁止弹出默认的键盘处理方法
  19. 2018.3.输入1个长度不大于100的字符串(由字母和空格组成),输出串中包含的单词个数。如不存在单词则输出0.
  20. css实现文字或者div盒子水平垂直居中的方法

热门文章

  1. 用数据库实现了一个分布式锁,虽简陋,但能用!
  2. Amazon上最畅销的「操作系统书」有哪些?
  3. Kafka日志清理之Log Compaction
  4. 矩阵中的最长递增路径
  5. 客观指标VS主观质量:拨开遮挡高清视频技术的迷雾
  6. 视频编解码优化以及与AI的实践结合
  7. 三十年TCP与七年QUIC 谁才是未来?
  8. Linux I/O 那些事儿
  9. nginx 源码学习笔记(二十一)—— event 模块(二) ——事件驱动核心ngx_process_events_and_timers
  10. ubuntu使用KVM创建虚拟机