C语言链表的建立(详解)

本文介绍了如何使用C语言实现一个简单的链表,包括添加节点、查看链表内容以及释放内存的过程。主要展示了`AppendNode`、`DisplyNode`和`DeleteMemory`三个函数的实现与在`main`函数中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个简单的链表可以分为三部分

  • ->增加链表节点
  • ->查看链表节点
  • ->释放节点

 建立三个函数

  • struct link* AppendNode(struct link* head); 添加节点
  • void DisplyNode(struct link* head);查看节点
  • void DeleteMemory(struct link* head);释放节点

在main函数中调用这三个函数,实现一个简单的链表. 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
struct link* AppendNode(struct link* head);
void DisplyNode(struct link* head);
void DeleteMemory(struct link* head);
struct link
{
	int data;
	struct link* next;
};
int main() {
	int i = 0;
	char c;
	struct link* head = NULL;			//链表头指针
	printf("是否添加一个新的节点(Y/N)?\n");
	scanf(" %c", &c);					 //%c前面有一个空格
	while (c == 'Y' || c == 'y')
	{
		head = AppendNode(head);		//向head为头指针的链表末尾添加节点
		DisplyNode(head);				//显示当前链表中的信息
		printf("你想要再添加一个节点吗(Y/N)?");
		scanf(" %c", &c);				//%c前面有一个空格
		i++;
	}
	printf("%d 节点显示 \n", i);
	DeleteMemory(head);					//释放所有动态分配的内存
}

//函数功能:新建一个节点并添加到链表末尾,返回添加节点后节点后的链表的头指针
struct link* AppendNode(struct link* head)
{
	struct link* p = NULL, * pr = head;
	int data;
	p = (struct link*)malloc(sizeof(struct link));//让p指向新建节点
	if (p == NULL)								//若为新建节点申请内存失败,则退出程序
	{
		printf("没有足够的空间\n");
		exit(0);

	}
	if (head == NULL)							//若原链表为空表
	{
		head = p;								//将新建节点置为头结点
	}
	else								//若原链表为非空,则将新建节点添加到表尾
	{
		while (pr->next != NULL)		//若未到表尾,则移动pr直到pr指向表尾
		{
			pr = pr->next;				//让pr指向下一个节点
		}
		pr->next = p;					//让末点的指针域指向新建节点

	}
	printf("输入节点数据:");
	scanf("%d", &data);		//输入节点数据
	p->data = data;			//将新建节点置为表尾
	p->next = NULL;			//返回添加节点后的链表头指针
	return head;
}
//函数的功能:显示链表中所有节点的节点号和该节点中的数据项内容
void DisplyNode(struct link* head)
{
	struct link* p = head;
	int j = 1;
	while (p != NULL)			//若不是表尾,则循环打印节点的值
	{
		printf(" % 5d % 10d\n", j, p->data);		//打印第j个节点的数据
		p = p->next;			//让p指向下一个节点
		j++;
	}
}

//函数功能:释放head指向链表中所有节点占用的内存
void DeleteMemory(struct link * head)
{
		struct link* p = head, * pr = NULL;
		while (p != NULL)			//若不是表尾,则释放节点占用的内存
		{
			pr = p;					//在pr中保存当前节点的指针
			p = p->next;			//让p指向下一个节点
			free(pr);				//释放pr指向的当前节点占用的内存
		}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值