链表初解

来源:互联网 发布:c语言其实很简单百度云 编辑:程序博客网 时间:2024/06/15 22:45

链表初解

做链表追赶问题的发现链表的使用特别生疏,所以翻出本科时候的C语言课本,对链表有个复习和回顾。

出现链表的motivation
我们知道,一批相同类型的数据,可以用数组来存储。每个数组元素的下表表明了它们在这一个序列中的位置。数组的元素在内存中是连续存放的,即逻辑上前后相邻的两个数据元素,其内存单元也是前后相邻的,称为物理相邻
但是,数组在实际程序设计中,有如下几个问题:
1)定义数组是必须指定数组的元素个数,此后无法更改数组的大小。on the one hand, 如果实际操作的元素个数小于指定的元素个数,则造成部分存储空间的浪费;on the other hand, 当处理过程中元素个数超过指定个数时,存储空间不够,某种程度上这个缺点更加致命!
2)上面数组空间不足的缺点可以通过指针来申请动态数组空间,我们可以根据实际的需要,我们需要多少空间,我们就要申请多少大小的动态空间。但是,即时这样,我们还会有一个问题:动态数组空间终究是一个数组,而数组始终要占用连续的一组空间,当处理的数据量比较爱哦大的时候,系统就不能保证有这么一片的连续的空间来分配;
3)数组连续存储的模式使得插入一个数据或者删除一个数据就需要移动许多元素,降低的存取的速度。

那么为了改变上面数组的缺点,我们引入了链表。

我们设计一种结构,其包含两个成员:一个成员存放数据元素本身,另一个成员存放下一个元素在内存中的起始地址,指向了空间存储的元素就是当前元素的下一个元素,这种存储结构就是链表结构。每一个这样的结构体变量就称为链表的结点。如果节点只有一个指向逻辑上下一个元素地址的指针,则称为单链表;如果结点有两个指针,分别指向其逻辑上前一个元素的起始地址和下一个元素的起始地址,则称为双链表。
单链表必须定义一个头指针,用来指向第一个结点位置;单链表最后一个结点的指针域为0(即NULL),表示单链表的结束。
链表结构的有点是:系统不必为应用程序分配一组连续的空间,可以充分利用系统的零散空间;有一个元素就可以生成一个结点,不会造成空间的浪费;对于插入、删除等操作不必通过移动元素实现,提高了效率。

关于单链表结点结构的定义、遍历、查找、插入、删除、逆置可以查考本科的教材。





0 0
原创粉丝点击