C语言笔记-双向链表和循环链表

两种链表的增删改查操纵类似于单向链表。

双向链表:

一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个连接:一个指向前一个节点,(当此“连接”为第一个“连接”时,指向空值或者空列表);而另一个指向下一个节点,(当此“连接”为最后一个“连接”时,指向空值或者空列表)

双向链表

双向链表也叫双链表。双向链表中不仅有指向后一个节点的指针,还有指向前一个节点的指针。这样可以从任何一个节点访问前一个节点,当然也可以访问后一个节点,以至整个链表。一般是在需要大批量的另外储存数据在链表中的位置的时候用。双向链表也可以配合下面的其他链表的扩展使用。

由于另外储存了指向链表内容的指针,并且可能会修改相邻的节点,有的时候第一个节点可能会被删除或者在之前添加一个新的节点。这时候就要修改指向首个节点的指针。有一种方便的可以消除这种特殊情况的方法是在最后一个节点之后、第一个节点之前储存一个永远不会被删除或者移动的虚拟节点,形成一个下面说的循环链表。这个虚拟节点之后的节点就是真正的第一个节点。这种情况通常可以用这个虚拟节点直接表示这个链表,对于把链表单独的存在数组里的情况,也可以直接用这个数组表示链表并用第0个或者第-1个(如果编译器支持)节点固定的表示这个虚拟节点。

循环链表

循环链表是一种链式存储结构,它的最后一个结点指向头结点,形成一个环。因此,从循环链表中的任何一个结点出发都能找到任何其他结点。循环链表的操作和单链表的操作基本一致,差别仅仅在于算法中的循环条件有所不同。

单向循环:

双向循环:

在一个 循环链表中, 首节点和末节点连接在一起。这种方式在单向和双向链表中皆可实现。要转换一个循环链表,你开始于任意一个节点然后沿着列表的任一方向直到返回开始的节点。再来看另一种方法,循环链表可以被视为“无头无尾”。这种列表很利于节约数据的存储缓存, 假定你在一个列表中有一个对象并且希望所有其他对象迭代在一个非特殊的排列下。

指向整个列表的指针可以被称作存取指针。

循环链表中第一个节点之前就是最后一个节点,反之亦然。循环链表的无边界使得在这样的链表上设计算法会比普通链表更加容易。对于新加入的节点应该是在第一个节点之前还是最后一个节点之后可以根据实际要求灵活处理,区别不大(详见下面实例代码)。当然,如果只会在最后插入数据(或者只会在之前),处理也是很容易的。

(0)

相关推荐

  • 链表常见的题型和解题思路

    链表常见的题型和解题思路

  • Go 数据结构和算法篇(一):链表

    前天 以下文章来源于xueyuanjun ,作者xueyuanjun xueyuanjun学院君的订阅号,我会在这里持续更新优质全栈编程技术教程,包括但不限于 Golang.PHP.JavaScrip ...

  • 辛苦整理的C语言笔记,还好没放弃

    c语言入门 C语言一经出现就以其功能丰富.表达能力强.灵活方便.应用面广等特点迅速在全世界普及和推广.C语言不但执行效率高而且可移植性好,可以用来开发应用软件.驱动.操作系统等.C语言也是其它众多高级 ...

  • 【C语言笔记】时间日期函数

    常持正念方圆梦,不忘初心总是春. /********前言********/ time.h是C/C++中的日期和时间头文件.用于需要时间方面的函数.下面分享time.h头文件中几个常用函数的用法: /* ...

  • 【C语言笔记】关于随机数的总结

    C语言的库头文件stdlib.h中有个生成随机数的函数: int rand(void); 该函数返回0~RAND_MAX之间的随机数,在stdlib.h中可知道,RAND_MAX为0x7FFF,如: ...

  • 【C语言笔记】变参函数

    提到变参函数,我们的感觉是不是既熟悉又陌生 ?感觉熟悉是因为我们平时都在使用着,如我们常使用的printf()函数与scanf()函数就是典型的变参函数.因为printf()函数是变参函数我们才可以根 ...

  • 【C语言笔记】ASCII码可见字符与不可见字符

    ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧 ...

  • 【C语言笔记】什么是ANSI C标准?

    我们在很多地方都有看到过K&R C.ANSI C.ISO C.C89.C99.C11等标准,具体有什么不同呢?(文末有个很好的实例) 什么是K&R C? 1978年,丹尼斯·里奇(De ...

  • 【C语言笔记】如何查看数据类型范围?

    知识点一:查看整数范围 当前的编译环境下,你可能不知道int的数据范围是多少,或者记不清无符号短整型的范围是0~65535还是0~65536?这时候就可以按照如下程序进行输出查看: #include ...

  • 【C语言笔记】分享一个C语言测试程序模板

    前言 平时需要测试一些比较模糊的知识点,或则想要验证一些函数时,我们常常会建一个test.c文件,然后在这个文件里写我们的测试代码,测试完毕后常常会删掉该文件.下次再遇到同样的问题的时候,可能又是记不 ...

  • 【C语言笔记】你的黑窗口闪退?

    上一篇中写到了Windows下体验Linux环境,其中的测试代码简单的打印一句话,如: 编译后得到test.exe,运行得到如下结果: 在命令行下运行可以输出结果,但是在文件夹下,双击运行test1. ...