C语言入门基础_初识链表

链表头指针和(多个)结点组成,其中每个结点都是一个结构体。

一、链表结点结构体

该结构体由两部分组成:

一部分是数据区,用于存放数据;

一部分是地址区,用于存放下一次申请到的内存的首地址。

创建一个链表结点结构体如下:

struct student
{
	int id;
	char name[20];
	char sex;
	int score;
	struct student* next;	//	指向struct student类型的指针
};

其中,id、name、sex、score是结点数据域的成员,next是结点指针域的成员。

其构成如图:

二、创建一个链表

 (注:该图片出自 链表(链式存储结构)及创建(C语言详解版)

当链表中有头节点时,头指针指向头节点;反之,若链表中没有头节点,则头指针指向首元节点。
(首元结点:第一个有数据的结点)

由图,我们创建一个无头节点的链表,让头指针指向首元结点:

第一步:创建一个结构体
该结构体由两部分组成:
1, 数据域(存放数据的成员)
2, 指针域(存放节点指针)

struct Node
{
	char a;    //数据域
	struct node* next;    //指针域
}node;    //节点名

第二步:创建一个头指针
头指针指向链表第一个节点的位置,方便后期找到链表

struct Node* head = NULL;	//定义链表头指针,初始化为空

第三步:创建一个首元节点
链表中第一个存有数据的节点被称为首元结点。

struct Node* tmp;
tmp = (struct Node*)calloc(1, sizeof(struct Node));

第四步:对首元结点初始化

tmp->a = 1;    //对数据域赋值
tmp->next = NULL;   //将该节点指针置为空

第五步,让头指针指向首元结点

head = tmp;

第六步,从第2个节点开始创建,假设再创建3个结点

链表结构如图:

 

for (int i = 2; i < 5; i++)
	{
		//创建一个新节点并初始化
		struct Node* new;
		new = (struct Node*)calloc(1,sizeof(struct Node));

		//对节点数据域赋值
		new->a = i;
		//将节点指针置为空
		new->next = NULL;

		//将tmp节点(首元结点)与新的节点建立逻辑关系
		tmp->next = new;

		//让tmp节点每次都指向新链表最后一个节点
		tmp = new;
	}

第七步,根据头指针输出链表所有节点的内容

struct Node* p;  //创建一个指针变量p


if (head != NULL)
	{
		p = head;

		//如果指针p不为NULL就一直指向下一个节点输出
		while (p != NULL)
		{
			printf("%d ",p->a);
			p = p->next;
		}
	}

由此可得到完整代码如下:

struct Node
{
	char a;    //数据域
	struct node* next;    //指针域
}node;    //节点名

int main()
{
	//第二步:创建一个头指针
	//头指针指向链表第一个节点的位置,方便后期找到链表

	struct Node* head = NULL;	//定义链表头指针,初始化为空


	//第三步:创建一个首元节点
	//链表中第一个存有数据的节点被称为首元结点。

	struct Node* tmp;
	tmp = (struct Node*)calloc(1, sizeof(struct Node));
	

	/*第四步:对首元结点初始化*/

	tmp->a = 1;    //对数据域赋值
	tmp->next = NULL;   //将该节点指针置为空


	//第五步,让头指针指向首元结点

	head = tmp;


	//第六步,从第2个节点开始创建,假设再创建3个结点

		for (int i = 2; i < 5; i++)
		{
			//创建一个新节点并初始化
			struct Node* new;
			new = (struct Node*)calloc(1,sizeof(struct Node));

			//对节点数据域赋值
			new->a = i;
			//将节点指针置为空
			new->next = NULL;

			//将tmp节点(首元结点)与新的节点建立逻辑关系
			tmp->next = new;

			//让tmp节点每次都指向新链表最后一个节点
			tmp = new;
		}

	//第七步,根据头指针输出链表所有节点的内容

		struct Node* p;  //创建一个指针变量p


		if (head != NULL)
		{
			p = head;

			//如果指针p不为NULL就一直指向下一个节点输出
			while (p != NULL)
			{
				printf("%d ",p->a);
				p = p->next;
			}
		}

	return 0;
}

运行结果:

输出链表所有节点的内容,即1 2 3 4

 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值