动态链表的实现(C语言)

记录学习第四天
今天复习一下动态链表的实现
C语言实现链表
一定会有着结构体和结构体指针;
那什么是动态链表;
在这里插入图片描述

打个比方,如果我想做一个学生成绩管理系统,但我不确定学生的人数,学生的信息可以用一个结构体来表示,由于不确定人数,我们如果用结构体数组,那数组的大小一定要够大,才能不出现数组元素不够用的情况,但是,剩下的结构体占着内存又是一种浪费,所以,就有了链表;
在这里插入图片描述
链表就是,我要记录一个学生的信息,我就造出来一个结构体来存放他的信息,然后把所有的结构体连起来,就形成了一个链表;
现在就来实现以下:
在这里插入图片描述
第一步。
首先我们要有一个结构体存放学生信息:

struct student{
int n;
struct student *next;
};

这里为了方便只有一int型数据和一个指向下个节点的指针;
那这个指针是用来干什么呢;
在这里插入图片描述
刚才说到,结构体连起来才形成链表,这个指针就是用来连接两个结构体;
如果有两个结构体stu1,stu2;
stu1->next=stu2;
那么是不是就相当于把这两个结构体按到一起了;
在这里插入图片描述
第二步。
这里我们定义三个结构体变量指针,用法一会会介绍:

struct student *head;
struct student *p1,*p2;

如果我有了第一个学生信息,那么我应该有第一个结构体来存放这个信息:
如果我们用p1这个指针来接收这个学生信息;

那么我们就要开辟一个结构体空间

p1=(struct student*)malloc(sizeof(struct student));

malloc函数是动态申请内存空间;(使用前要加上malloc的头文件)
然后你就可以输入第一个学生信息了;
因为是第一个节点,所以我们直接让head指向这个节点就好了;

head=p1;

现在这个head就是头结点;
我们再让p2也指向这个头结点;(为什么一会就知道 了)

p2=p1;

第三步:
如果又来一个学生信息;
我们就再malloc一个动态内存

p1=(struct student*)malloc(sizeof(struct student));

现在要做的就是把这个p1安在head的后面;
可能有同学会这么想:
直接head->next=p1不就完了;
真是这样吗?
在这里插入图片描述
如果这么做了的话,第二个没问题;
如果你malloc第三个第四个呢:
动态链表的实现(C语言)_第1张图片
是不是就会出现这样的问题,所以我们要用到刚才的p2;
我们让p1变成p2的下一个

p2->next=p1;

动态链表的实现(C语言)_第2张图片

然后我们再让p1变成p2。

p2=p1;

这个时候是不是就会这样:
动态链表的实现(C语言)_第3张图片
然后,如果再有学生录入,就重复第三步就可以了,(再malloc一个p1放在p2后面,然后p1变p2)这样就会实现出一个链表了!
至于完整代码就不写了,因为思想在这里,每个人都有不同的方法去实现出一个链表,只要方法对就完全ok的!
今天结束
点赞!

你可能感兴趣的:(动态链表的实现(C语言))