小鲤算法C(单链表系列2之创建链表)

目录

前言

小鲤碎碎念

创建链表具体操作 

1,创建结点

2,主函数

3,创建链表函数


前言

         你掌握了基础知识吗?恭喜你,技能点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(* ̄▽ ̄*)ブ

今天的内容已经结束了>_<

如果我的文章对你有帮助,不要吝惜你的点赞,小鲤希望得到你的支持ლ(´ڡ`ლ)

求三连和关注!!!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>