C语言实现链表的创建
链表:是一种物理存储单元上非连续、非顺序的存储结构
,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点
链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
从链表的概念中不难得出,链表是由一系列结点组成的。
结点又包含有数据域和指针域,数据域存储数据元素,指针域则用来指向别的结点或者存储下一个结点地址,起到链接作用。
一.从百度百科的这副图片来简单理解一下链表的结构
1.创建头结点head
2.在创建一个结点用来保存每次插入的结点p1
3.循环创建一般结点p2、p3…
4.将创建的结点与已有的结点链接起来
5.遍历链表并输出数据
注意!
我们需要使用malloc函数给结点分配内存,malloc用完最好free,防止造成内存泄漏
- 链表的优点:灵活性。插入和删除操作时,只需修改被删节点上一节点的链接地址,不需要移动元素,从而改进了在顺序存储结构中的插入和删除操作需要移动大量元素的缺点。
- 链表的缺点: 随机访问。链表的访问取决于结点的位置,当需要随机访问结点时,在顺序存储结构中的效率低。
二.链表的相关操作
1.创建链表(前插法、尾插法、序插法、定位法)
- 前插法:将新生成的结点依次插入头结点之后创建链表。
- 尾插法:将新生成的结点依次插入到链表的最后面,作为新链表的最后一个结点。
- 序插法:将新生成的结点依次插入后保证结点域数据的有序性。
- 定位法:新生成的结点依次插入到链表中指定的位置中。
2.遍历链表:就是对于某一个数据结构中所有元素按照一定的顺序依次访问。对链表来说,就是从链表的头结点一直访问到链表的尾结点。
3.清空链表:把所有存有数据的结点清空释放出去(除了头结点以外)。
4.销毁链表: 把链表的东西全部清空,就不存在这个链表了,把包括头结点在内的所有节点释放掉。
5.链表逆序:把每一个节点指向的下一个节点的next的指针倒过来进而指向它的前面的那个节点。
三、代码示例
- 我用尾插法来展示我对链表的理解,尾插法也是最容易理解的。
/*尾插法建立链表*/
#include <stdio.h>
#include <stdlib.h>
struct list <