小鲤算法C(单链表系列2之创建链表)
目录
前言
你掌握了基础知识吗?恭喜你,技能点get+1。但是今天的内容稍有难度,准备好了吗?
小鲤碎碎念
单链表的创建方法有尾插法和头插法,每种都有带头节点和不带头节点两种 。今天小鲤主要介绍链表的创建的带头节点的尾插法,是最为简单的。
首先,你得了解单链表是什么形式。假设你是一名地下情报工作人员,你的上线知道你的联系方式,所以他可以找的到你。但是,你没有他的联系方式,所以你找不到他。不过,你也有你的下线的联系方式。这次是你能找的到你的下线,但是你的下线找不到你。但是,如果你非常苦逼,没有下线的话(链表最后一个节点),你就只能靠你的上线来找你了。当然,你足够幸运的话,你没有上线(head头节点),却有一个可以被找到的下线。
(不会被搞?了吧?那就再看看两遍再继续吧。希望小鲤的讲解够形象)
创建链表具体操作
我们这里以创建一个存放学生学号,性别和姓名的链表为例。
1,创建结点
struct link_list
{
int num;
char sex[20];
char name[30];
struct link_list *next;
};
上一节的必备基础知识3结构体知识用到了吧,这里就不解释了。忘记的感觉回去看一看。
思考?
struct link_list *next是什么?拿来干什么的?
?struct link_list类型指针。是用来联系你下级的。你和你下级(下一个结点)唯一的联系方式就是这个next指针。强调,他只是一个指针,所以不要搞复杂想着他有没有什么成员。初学者易犯!!!
2,主函数
int main(){
int n; //(1)
scanf("%d",&n);
struct link_list*head=(struct link_list*)malloc(sizeof(struct link_list)); //(2)
head->next=NULL; //(3)
creat_list(head, n); //(4)
return 0;
}
先讲主函数吧,上游决定下游。难的放在最后呀。
(1)变量n是我们要创建结点个数;
(2)创建头结点指针。这个指针指向我们申请的struct link_list空间。这个空间的数据域是不存放任何东西的,而这个空间的next指针将会指向第一个结点。
malloc是申请空间函数。(struct link_list*)是类型强制转换。
思考?
为啥要申请空间啊,我直接struct link_list*head它不香吗?
? 上文已经提示过来,他只是指针!!!他没有自己的空间。所以仅仅定义一个struct link_list类型指针是没办法指向成员的。
(3) 思考?
head->next为什么要为NULL?
?NULL的意思是0,事实上,我们直接写0也没有任何问题,但是编译器有时可能会爆。一般而言,NULL经常被使用。NULL即是空。
也就是说为啥要把头指针的next置空呢?道理很简单,这个时候他还没有下线,所以没有联系方式(即指向下一个结点地址),但是我们不给它赋初值会很可怕的,系统会给它分配一个随机地址,此时它也就是我们常说的野指针了,所以如果指针不知道指向谁时,请给它置空。
3,创建链表函数
开始了,开始了,前方高能预警,建议记好笔记(当然笔记是不可能滴,所以就只能点?了)
老规矩,我们先放代码再讲解。
void creat_list(struct link_list*head,int n){
struct link_list *p=NULL,*q=head; //(1)
while(n--){ //(2)
p=(struct link_list*)malloc(sizeof(struct link_list)); //(3)
if(p){
q->next=p; //(4)
q=p;
}
}p->next=NULL; //(5)
}
是不是出乎意料的少?欸,小鲤其实想看看先前听见小鲤说挺难的之后,有多少人真正为了学知识留下来,嘿嘿
(1)这里我们创建了两个指向struct link_list变量指针,这部分最为重要的就是这两个指针的含义了。
思考?
为什么要定义两个指针,他们是起什么作用呢?
?两个问题其实在问一个问题,就是两个指针作用。对于p指针来说,它是负责指向一个新的结点的。而q指针是一个临时变量,它负责转交地址。
(2)循环,注意到传入参数的n,代表结点个数。要创建几个结点,就循环多少次。
(3)这里就是申请的内存空间的。每循环一次,创建一个结点,就申请了一个空间。再还没有给它连上主体时,用p指针来记住它。
(4)这里分几步进行,小鲤手绘了几张图(小鲤手残,勿怪勿怪)
①q->next=p让q的next指向创建的节点。
这里的空白结点是之前向内存块申请的地址,被p指向。
①的操作为绿色→,蓝色→为之前的操作。
②让q临时变量指向创建的节点地址。
(5)随时让下一个结点指针域置空。
然后循环操作,直到循环结束。
好啦,创建完成了,赶紧在你的编译器上试一试吧。
小鲤只是一条想要好运的笨鲤鱼o(* ̄▽ ̄*)ブ
今天的内容已经结束了>_<
如果我的文章对你有帮助,不要吝惜你的点赞,小鲤希望得到你的支持ლ(´ڡ`ლ)
求三连和关注!!!