单链表<数据结构 C版>
创始人
2024-12-09 07:35:40
0

目录

概念

 链表的单个结点

 链表的打印操作

新结点的申请

尾部插入

头部插入

尾部删除

头部删除

查找

在指定位置之前插入数据

在任意位置之后插入数据

测试运行一下:

 删除pos结点

 删除pos之后结点

 销毁链表


概念

单链表是一种在物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接顺序实现的。

链表的每个结点有两个部分,分别是数据和指向下个结点的指针,每个链表的最后一个结点的下一个结点为NULL(不能对NULL解引用)。

放一张bit课件里的图,我觉得很形象:


 链表的单个结点

typedef int SLDataType;//重定义一下在链表内存放的数据类型,方便后期对类型进行统一修改  //链表的单个结点 typedef struct SListNode {//Single List Node :链表结点 	SLDataType data;//存放的数据 	struct SListNode* next;//指向下一个结点的指针 }SLNode;//重定义名字方便后期使用

 链表的打印操作

//链表的打印操作 void SLPrint(SLNode* phead) { 	assert(phead);//不能传入空指针 	SLNode* pcur = phead; 	//pointer cursor:指针光标,不让头结点丢失(虽然不会改变头结点的指向) 	while (pcur) {//等同于pcur!=NULL 		printf("%d->", pcur->data);//打印此结点的数据 		pcur = pcur->next;//使pcur指向下一个结点 	} 	printf("NULL\n"); }

新结点的申请

后面会涉及到新结点的插入,申请新结点可以封装成一个函数,避免代码冗余

//新结点的申请 SLNode* SLBuyNode(SLDataType x) { 	SLNode* node = (SLNode*)malloc(sizeof(SLNode)); 	if (!node) {//返回值为空,申请失败(一般是空间不足了),直接退出 		perror("malloc fail"); 		exit(1); 	} 	node->data = x;//将数据赋给data 	node->next = NULL;//将下一个节点置为NULL; 	return node; }

尾部插入

//尾部插入 void SLPushBack(SLNode** pphead, SLDataType x) { 	//注意在这里我们传参的是二级指针,因为我们需要在函数内部改变头结点的指向 	assert(pphead);//不能传NULL 	//新结点的申请 	SLNode* node=SLBuyNode(x); 	if (*pphead == NULL) { 		*pphead = node; 	} 	else { 		SLNode* pcur = *pphead; 		while (pcur->next) {//找到next元素为NULL的结点,也就是为链表尾部 			pcur = pcur->next; 		} 		pcur->next = node; 	} 	 }

测试运行一下:


头部插入

//头部插入 void SLPushFront(SLNode** pphead, SLDataType x) { 	assert(pphead); 	SLNode* node = SLBuyNode(x); 	//这里需要处理头结点为空的情况吗?不需要,因为没有涉及到解引用其元素 	node->next = *pphead; 	*pphead = node; } 

测试运行一下:


尾部删除

//尾部删除 void SLPopBack(SLNode** pphead) { 	assert(*pphead && pphead);// 	if (!(*pphead)->next) {//处理只有一个元素的情况 		free(*pphead); 		*pphead = NULL; 	} 	else { 		SLNode* prev = NULL; 		SLNode* pcur = *pphead; 		while (pcur->next) {//找到尾结点前一个结点 			prev = pcur; 			pcur = pcur->next; 		} 		free(pcur);//将尾结点释放 		pcur = NULL; 		prev->next = NULL;//将尾结点的前一个结点的next元素置为NULL 	} }

测试运行一下:


头部删除

//头部删除 void SLPopFront(SLNode** pphead) { 	assert(*pphead && pphead); 	SLNode* next = (*pphead)->next;//保存头结点的下一个结点地址 	free(*pphead);//释放头结点 	*pphead = next;//使头结点指向下一个结点 }

测试运行一下:


查找

在链表中想要对指定位置进行操作不能使用下标,所以我们必须找到指定位置的地址才能对其进行操作。

//查找 SLNode* SLFind(SLNode* phead, SLDataType x) { 	assert(phead); 	SLNode* pcur = phead; 	while (pcur) { 		if (pcur->data == x) { 			return pcur; 		} 		pcur = pcur->next; 	} 	return NULL; }

在指定位置之前插入数据

//在指定位置之前插入数据 void SLInsert(SLNode** pphead, SLNode* pos, SLDataType x) { 	assert(pphead && pos && *pphead);//pos和pphead不能为空,以及pphead指向空间不能为空 	if (*pphead == pos) {//处理头插的情况 		SLPushFront(pphead,x); 	} 	else { 		SLNode* node = SLBuyNode(x); 		SLNode* pcur = *pphead; 		while (pcur->next != pos) {//找到pos前一个结点 			pcur = pcur->next; 		} 		node->next = pcur->next; 		pcur->next = node; 	} }

测试运行一下:


在任意位置之后插入数据

//在任意位置之后插入数据 void SLInsertAfter(SLNode* pos, SLDataType x) { 	assert(pos);//pos不能为空 	SLNode* node = SLBuyNode(x); 	node->next = pos->next; 	pos->next = node; }

测试运行一下:


 删除pos结点

//删除pos结点 void SLErase(SLNode** pphead, SLNode* pos) { 	assert(*pphead && pphead && pos); 	if (*pphead == pos) {//处理头删的情况 		SLPopFront(pphead); 	} 	else { 		SLNode* pcur = *pphead; 		while (pcur->next!= pos) { 			pcur = pcur->next; 		} 		pcur->next = pos->next; 		free(pos); 		pos = NULL; 	} }

 测试运行一下:


 删除pos之后结点

//删除pos之后结点 void SLEraseAfter(SLNode* pos) { 	assert(pos && pos->next);//pos后面的结点也不能为空 	SLNode* next = pos->next; 	pos->next = next->next; 	free(next); 	next = NULL; }

 测试运行一下:

 


 销毁链表

//销毁链表 void SLDestory(SLNode** pphead) { 	assert(pphead && *pphead); 	SLNode* pcur = *pphead; 	while (pcur) { 		SLNode* nextnode = pcur->next;//使用一个变量接受下一个结点地址 		free(pcur); 		pcur = nextnode; 	} 	*pphead = NULL; }

相关内容

热门资讯

我来教你/金花房间怎么创建天道... 我来教你/金花房间怎么创建天道联盟/微信链接房卡销售购买天道联盟是一款非常受欢迎的游戏,咨询房/卡添...
炸金花房卡链接多少钱/微信牛牛... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:86909166许多玩家在游戏中会购买房卡来享受...
正版授权“微信牛牛链接金花房卡... 随意玩是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房卡来享...
正规平台有哪些,金花房卡官网新... 新海贝大厅/新神兽是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:3...
ia攻略/金花房卡制作链接卡农... 您好!微信卡农大厅大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(卡农大厅)大厅介绍:...
ia实测“微信金花房卡哪里买的... 新九天是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来享...
重大通报,牛牛房卡怎么获得新下... 重大通报,牛牛房卡怎么获得新下游/人皇大厅/微信链接房卡购买联系方式新下游/人皇大厅是一款非常受欢迎...
重大通报,牛牛房卡出售乐酷大厅... 今 日消息,乐酷大厅房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
正版授权“炸金花微信建群自己开... 新518互游是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:44346008许多玩家在游戏中会购买房...
玩家攻略,金花房卡代理零售皇后... 玩家攻略,金花房卡代理零售皇后大厅/房卡客服皇后大厅是一款非常受欢迎的游戏,咨询房/卡添加微信:88...
ia攻略/金花房卡专卖店海草众... ia攻略/金花房卡专卖店海草众厅/微信链接房间卡怎么购买Sa9Ix苹果iPhone 17手机即将进入...
头条推荐!金花房卡如何购买山竹... 今 日消息,山竹众娱房卡添加微信33549083 苹果今日发布了 iOS 16.1 正式版更新,简单...
房卡必备教程“微信上玩炸金花冲... 牛牛大厅是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:15984933许多玩家在游戏中会购买房卡来...
安卓11系统分享不了,安卓11... 最近是不是发现你的安卓手机升级到了11系统,但是分享功能突然失灵了?别急,让我来帮你一探究竟,找出这...
头条推荐!斗牛房间怎么创建的芙... 头条推荐!斗牛房间怎么创建的芙蓉大厅/微信链接房卡批发价芙蓉大厅是一款非常受欢迎的游戏,咨询房/卡添...
我来教你/牛牛房卡批发平台黄帝... 您好!微信黄帝大厅大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(黄帝大厅)大厅介绍:...
一分钟推荐“微信斗牛房卡怎么来... 新星游牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:160470940许多玩家在游戏中会购买房...
头条推荐!金花房卡批发精灵大厅... 微信游戏中心:精灵大厅房卡在哪里买打开微信,添加客服微信【88355042】,进入游戏中心或相关小程...
头条推荐!金花房卡出售众神联盟... 众神联盟是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:【3329006910】或QQ:332900...
科技实测!金花房卡批发精灵大厅... 您好!微信精灵大厅大厅链接获取房卡可以通过以下几种方式购买: 1.微信渠道:(精灵大厅)大厅介绍:...