一郎科技|就靠这20+张图了,一口气搞懂「链表」( 二 )


元素表示数据元素的映象 , 就是存储数据的存储单元;指针指示出后继元素存储位置 , 就是连接每个结点的地址数据 。
以结点的序列表示的线性表称作线性链表 , 也就是单链表 , 单链表是链式存取的结构 。
对于链表的每一个结点 , 我们使用结构体进行设计 , 其主要内容有:
其中 , DATA数据元素 , 可以为你想要储存的任何数据格式 , 可以是数组 , 可以是int , 甚至可以是结构体(这就是传说中的结构体套结构体)
NEXT为一个指针 , 其代表了一个可以指向的区域 , 通常是用来指向下一个结点 , 链表的尾部NEXT指向(空) , 因为尾部没有任何可以指向的空间了
故 , 对于一个单链表的结点定义 , 可以代码描述成:
//定义结点类型
typedefstructNode{
intdata;//数据类型 , 你可以把int型的data换成任意数据类型 , 包括结构体struct等复合类型
structNode*next;//单链表的指针域
}Node,*LinkedList;
//Node表示结点的类型 , LinkedList表示指向Node结点类型的指针类型
链表的初始化初始化主要完成以下工作:创建一个单链表的前置节点并向后逐步添加节点 , 一般指的是申请结点的空间 , 同时对一个结点赋空值 , 其代码可以表示为:
LinkedListlistinit{
Node*L;
L=(Node*)malloc(sizeof(Node));//开辟空间
if(L==){//判断是否开辟空间失败 , 这一步很有必要
printf("申请空间失败");
//exit(0);//开辟空间失败可以考虑直接结束程序
}
L->next=;//指针指向空
}
注意:一定要判断是否开辟空间失败 , 否则生产中由于未知的情况造成空间开辟失败 , 仍然在继续执行代码 , 后果将不堪设想啦 , 因此养成这样的判断是很有必要的 。
头插入法创建单链表利用指针指向下一个结点元素的方式进行逐个创建 , 使用头插入法最终得到的结果是逆序的 。 如图所示:
//头插法建立单链表
LinkedListLinkedListCreatH{
Node*L;
L=(Node*)malloc(sizeof(Node));//申请头结点空间
L->next=;//初始化一个空链表
intx;//x为链表数据域中的数据
while(scanf("%d",&x)!=EOF){
Node*p;
p=(Node*)malloc(sizeof(Node));//申请新的结点
p->data=https://pcff.toutiao.jxnews.com.cn/p/20200829/x;//结点数据域赋值
p->next=L->next;//将结点插入到表头L-->|2|-->|1|-->
L->next=p;
}
returnL;
}
尾插入法创建单链表如图所示为尾插入法的创建过程 。
该方法是将新结点逐个插入到当前链表的表尾上 , 为此必须增加一个尾指针r,使其始终指向当前链表的尾结点 , 代码如下:
//尾插法建立单链表
LinkedListLinkedListCreatT{


推荐阅读