如何创建链表?链表创建没那么难!

引言:

	最近我们c语言课学到了链表,好多同学都在说:“哇!链表怎么这么难,根本看不懂呀!” 
不要怕,在这一篇博客中,我会给你详细讲解每一行代码!

链表:

链表的组成其实很简单,就是由很多结点组成的。
一个结点包含数据域和指针域,数据域用来存放数据,指针域负责指向其他结点,起到链接的作用。

创建链表:

其实创建一个链表也很简单,在我看来,可以分为以下几步:
1.创建头结点。(命名为:head)
2.在创建一个结点用来保存每次插入的结点.(命名为:p)
3.循环创建一般结点。(命名为:s)
4.将创建的结点与已有的结点链接起来!
5.遍历链表,输出数据。
需要注意的是:
1.创建结点时一定不要忘了给它分配内存空间;
2.创建的所有结点都应该是指针型的结构体;
3.链表一定要有“尾”。

代码如下:

	因为我觉得尾插法相对头插更容易理解,所以先用尾插法向你们演示一番。
//尾插法建立链表:
#include <stdio.h>
#include <stdlib.h>//里面包含了malloc函数
struct LinkList//创建结构体
{
	int data;//数据域,用来保存数据。
	struct LinkList* next;//指针域,用来连接其他结点。
};
int main(void)
{
	struct LinkList* head = (struct LinkList*)malloc(sizeof(struct LinkList));//创建头结点,并分配内存,需要的内存大小就是结构体的大小。别忘了在malloc前进行强制类型转换。(struct LinkList*)
	head->next = NULL;//头结点指针初始化
	struct LinkList* p = (struct LinkList*)malloc(sizeof(struct LinkList));//创建p结点,并分配内存
	p->next = NULL;//p结点指针初始化
	int n;//保存链表长度,即结点的个数。
	printf("请输入链表长度:\n");
	scanf("%d", &n);
	printf("输入数据:\n");
	for (int i = 0; i < n; i++)//循环创建结点
	{
		struct LinkList* s = (struct LinkList*)malloc(sizeof(struct LinkList));//创建s结点,并分配内存
		scanf("%d", &s->data);//给s结点赋值。
		//尾插法建立链表
		if (i == 0)//插入第一个结点时:
		{
			head->next = s;//让头结点的指针指向新建的s结点
			s->next = NULL;//s结点指针域一定要指向NULL,不然链表就有头没尾了!
		}
		else if (i>0)//插入完第一个以后,插入其他结点时:
		{
			p->next = s;//因为插完第一个结点后用p保存了上一个结点,所以再插结点时应该插在p节点后面,这就是尾插。
			s->next = NULL;//别忘了让插在尾部的s结点的指针指向NULL。
		}
		p = s;//p结点保存刚才的s结点;
	}//至此,链表的创建已经完成了。

	p = head;//让p指针从"头"开始。
	while (p->next != NULL)//如果p的下一个结点不为NULL,也就是说如果p结点后还有节点存在,那就输出p后面结点中保存的数据。
	{
		printf("%-5d", p->next->data);
		p = p->next;//p结点后移
	}
	printf("\n");
	return 0;
}//至此完成了链表的遍历输出。

代码运行结果:
在这里插入图片描述

好!接下来就是头插法建立链表了,同样,头插法与尾插法一般无二,所以废话不多说,直接上代码!
//头插法建立链表:
#include <stdio.h>
#include <stdlib.h>
struct LinkList
{
	int data;
	struct LinkList* next;
};
int main(void)
{
	struct LinkList* head = (struct LinkList*)malloc(sizeof(struct LinkList));
	head->next = NULL;
	struct LinkList* p = (struct LinkList*)malloc(sizeof(struct LinkList));
	p->next = NULL;
	int n;
	printf("请输入链表长度:\n");
	scanf("%d", &n);
	printf("输入数据:\n");
	for (int i = 0; i < n; i++)
	{
		struct LinkList* s = (struct LinkList*)malloc(sizeof(struct LinkList));
		scanf("%d", &s->data);
		//头插法
		if (i == 0)//在插入第一个结点时,头插与尾插没有区别,只能插在头结点后面。
		{
			head->next = s;//所以头结点的指针指向s结点
			s->next = NULL;
		}
		else if (i>0)//插入完第一个以后,插入其他结点时:
		{
			head->next = s;//每次新建的s结点都插在头结点后面,
			s->next = p;//s结点应该插在上一次创建并保存的p结点的前面,所以s指针域指向p。
		}
		p = s;//p结点保存刚才的s结点;
	}//至此完成头插法建立链表。

	p = head;
	while (p->next != NULL)
	{
		printf("%-5d", p->next->data);
		p = p->next;
	}
	printf("\n");
	return 0;
}

程序运行结果:
在这里插入图片描述

最后:

链表这里的知识是很重要的,因为链表是最简单的数据类型,所以在我后面的博客中,我会通过例题,再向大家讲解一下链表的增加、删除、排序等。
我也是c语言的初学者,以上代码都是根据我的理解打出来的,可能存在不足之处,
也希望大佬们批评指正,若有问题欢迎留言一起讨论,共同进步!

猜你喜欢

转载自blog.csdn.net/qq_42080839/article/details/85545370