单链表浅析

头插法的单链表解析

首先说明这些东西都是个人理解

首先我们了解一下单链表
什么是单链表呢
这个是根据它的内存来判断的
我们的线性表一共是有两种情况
分为顺序表和链表
顺序表就是在内存中开辟一块大块的存储空间
然而我们在计算机的使用过程中不是一直有一整块一整快的存储空间的
所以就随之诞生了链表
链表就是内存一小块一小块的存储空间
这跟线性表有什么关系,一开始都是有着这样子的疑问的
看一下单链表的结构
一个结点是这样子的结构
也就是我刚才提到的一小块一小块的内存
在这里插入图片描述
Data是我们存数据的地方
Next是指向下一个结点,就是下一个内存的地方
这样子一块一块的内存就链接起来了
这就是单链表
单链表的建立有两种方法
这里简单描述一下头插法
头插法分为带头和不带头结点
这两个区别主要是第一个指针是否存储数据
这里主要讲一下带头结点
带头结点即为第一个不存储数据
首先初始化一个结点
代码为L=(LinkList)malloc(sizeof(LNode));
L->next =Null;
对这个代码解析就是malloc就是申请开辟一块空间,开辟了一块内存后我们将它的Next指为空
现在我们会有一个这样得头结点在这里插入图片描述

大概就是这个样子
但是Data不存储数据

如果要建立一个线性表
它的数据显然不只会是一个,如果要获得更多得数据
我们需要申请一个新的结点
就是我们再次执行一次上面开辟空间得代码,需要创建一个新的变量
S=(LinkList)malloc(sizeof(LNode));
创建好了并且把它的地址赋值给S
现在我们得内存中间有两个内存块
在这里插入图片描述

这时候我们已经有了如图所示得内容
思考一下
我们这么把这两个连接起来
L为图中没有标志的内存块
是不是把l的next存入s的next地址
就是这一行代码
s->next = l->next;
然后我们的
s的下一跳指向空结点
在这里插入图片描述

这样子建立起来了我们的链表
若是代码行列反转一下
我们先把
L->next=s;
S->next =L->next;
就是我们把s又指回了它本身
所以代码顺序一定要注意

完整的代码实现为
结点的创立
typedef struct LNode
{
Elemtype data;
struct LNode *next;
}LNode,*LinkList
注意用C++来执行该代码,因为C的变量不支持&L的引用
LinkList List_HeadInsert(LinkList &L)
{
LNode *s;int x;
L=(LinkList)malloc(sizeof(LNode));
L->next=null;
scanf("%d",x);
while(x!=9999)
{
s=(LinkList)malloc(sizeof(LNode));
s->data=x;
s->next=l->next;
l->next=s;
scanf("%d",x);
}
}

这段话为对代码的解析
如果看懂了请自行忽略
LNode s;这一步是初始化一个结点,并且指向它的指针变量
int x;这个是为了输入的变量作准备的
然后下面两部按部就班的执行看不懂可以看看上面的含义
while循环体代表这如果我们不输入9999就会一直执行插入
当输入9999时跳出该循环;
s为刚才的申请初始化的结点
然后我们可以得到了s得地址 注意这里不需要带指针符

这样子s代表得是这个结点得地址
接下来两部上面解释过了
执行完之后我们输入数值判断该数值是否为结束数
继续重复上面步骤来实现头插法

猜你喜欢

转载自blog.csdn.net/qq_44965100/article/details/108462411