引言:
链表是线性表的一种在逻辑结构:一定是线性的,物理结构:不一定是线性的。链表是由
一.单链表概念及结构
在学习链表之前,我们先从概念上来理解什么是单链表。链表的结构跟火车十分相似,都是独立的一节一节的,通过某种方式将一节一节的火车连接到一起。如图下面是一个火车的图片。
旺季是火车会增加车厢,淡季时火车火车会减少车厢,但是增加减少车厢并不会影响火车的正常行驶,想象一下火车上的每一节车厢都是被锁上的需要钥匙才能打开,如果每次只能带一把钥匙,如何从车头走到车尾呢?答案是每打开一节车厢,就必须要找到下一节车厢的钥匙,同样那么单链表每一借车厢是怎样的呢?这里用一幅图来解释
如图所示单链表的每节“车厢”都是独立申请下来的空间,称之为节点或结点,每个节点由两部分组成,当前节点的数据和下一个节点的地址(也就是指针变量),如图所示plist保存的是第一个节点的地址,称之为plist指向的是第一个节点,如果想要让plist指向低二个节点,只需要让plist的地址修改位第二个节点的地址也就是0X00000012.
为什么要用指针变量保存下一个节点的地址呢?其实就跟车厢的钥匙一样,只要找到这节车厢的钥匙才能打开下一届车厢,知道下一节车厢的具体情况,同样链表中的每个节点都是向操作系统独立申请的空间,每个节点都保存着节点数据和下一个节点的地址,找到下一个节点,需要通过指针保存下一节点的地址才能从当前节点找到下一节点。
结合结构体所的知识,这里我们用结构体来定义单链表的数据和指针变量。、
那么如何水现单链表从头到尾打印呢?
这里补充说明一下:链表在逻辑上连续的,在物理结构上不一定连续,因为节点是从堆上申请的,每次申请的空间可能连续可能不连续
下面详细介绍单链表的各项操作
二、链表的实现
注:Slist.h用于函数的定义和声明以及单链表结构的定义
SList.c单链表的实现
test.c单链表的测试
2.1打印
2.2创建节点
2.3尾插
2.4头插
2.5尾删 2.6头删
2.7查找
2.8在指定位置之前插入数据
2.9在指定位置之后插入数据
在插入之前需要找到pos节点,在进行插入
2.10删除pos节点
2.11销毁链表
销毁一个一个节点,思路先把下一个节点存储起来,把当前节点释放,当前节点指向下一个节点,重复次操作
完整代码:
Slist.h
SList.c
test.c