【单链表】的增删查改

news2024/12/23 8:32:38

🖊作者 : Djx_hmbb
📘专栏 : 数据结构
😆今日分享 : “Onc in a blu moon” : “罕见的,千载难逢的” (出现在19世纪,指的是"在一个月内出现的第二次圆月”,这种现象每隔32个月发生一次。)
在这里插入图片描述

文章目录

  • ✔单链表的功能实现:
    • 🔎申请一个结点空间 :
    • 🔎构建n个链表 :
    • 🔎打印链表 :
    • 🔎尾插 :
    • 🔎尾删 :
    • 🔎头插 :
    • 🔎头删 :
    • 🔎查找 :
    • 🔎在pos位置后插入x :
    • 🔎在pos位置前插入x :
    • 🔎删除pos位置后一个指针 :
    • 🔎删除pos位置的指针 :
    • 🔎释放空间 :
  • ✔头文件(详情):
  • ✔测试文件(详情):
    • 家人们,点个![请添加图片描述](https://img-blog.csdnimg.cn/11dae7d2dd1b46b2b021edaccee67cf1.jpeg)再走呗~

✔单链表的功能实现:

🔎申请一个结点空间 :

//为单链表申请一个结点空间
SLT* SLTBuy(SLTdataType x)
{
	SLT* newNode = (SLT*)malloc(sizeof(SLT));
	if (newNode == NULL) 
	{
		perror("malloc fail:");
		exit(-1);
	}
	else
	{
		newNode->data = x;
		newNode->next = NULL;
	}
	return newNode;
}

🔎构建n个链表 :

//构建n个链表
SLT* SLTCreate(SLTdataType x)
{
	SLT* phead = NULL, * ptail = NULL;
	for (int i = 0; i < x; i++)
	{
		SLT* newNdoe = SLTBuy(i);
		if (phead == NULL)
		{
			phead = ptail = newNdoe;
		}
		else 
		{
			ptail->next = newNdoe;
			ptail = newNdoe;
		}
	}
	return phead;
}

🔎打印链表 :

//打印链表
void SLTPrint(SLT* phead)
{
	SLT* cur = phead;
	while (cur != NULL)
	{
		printf("%d ",cur->data);
		cur = cur->next;
	}
	 puts("NULL\n");
}

🔎尾插 :

//尾插!!!!!!!!!!!!!!!!!!要用取地址!!!!!!!!!!!
void SLTPushBack(SLT** pphead, SLTdataType x) 
{
	SLT* newNode=SLTBuy(x);
	
	if (*pphead == NULL)
	{
		*pphead = newNode;
	}
	else
	{
		SLT* ptail = *pphead;
		//找尾结点
		while (ptail->next)
		{
		//移动指针
			ptail = ptail->next;
		}
		//将新建的结点插入尾结点
		ptail->next = newNode;
	}
	
}

🔎尾删 :

//尾删
void SLTPopBack(SLT** pphead)
{
	assert(*pphead);//检查链表头结点是否为空

	//法一:
	SLT* ptail = (*pphead)->next;
	SLT* cur = *pphead;
	//判断头结点是否为空
	 if(*pphead != NULL)
	 {
	//判断第二个节点是否为空(ptail)
		 if ((*pphead)->next != NULL)
		 { //找尾
			 //SLT* ptail = (*pphead)->next;
			 while (ptail->next)
			{
				cur = ptail;
				ptail = ptail->next;
			}
	//找到尾后,释放空间,并将前面的一个结点置为空
			free(ptail);
			cur->next = NULL;
		 }
		 else
		 {
			 free(*pphead);
			 *pphead = NULL;
		 }
	 }
	 else
	 {
		 free(*pphead);
		 *pphead = NULL;
	 }
	
	

	法二:
	//SLT* ptail = *pphead;
	找尾
	//if (ptail->next)
	//{
	//	while (ptail->next->next)
	//{
	//	ptail = ptail->next;
	//}
	找到尾后,释放空间,并将前面的一个结点值为空
	//free(ptail->next);
	//ptail->next = NULL;
	//}
	//else
	//{
	//	free(*pphead);
	//	*pphead = NULL;
	//}
	
}

🔎头插 :

//头插
void SLTPushFront(SLT** pphead, SLTdataType x)
{
	SLT* newNode = SLTBuy(x);
	if (*pphead==NULL)
	{
		*pphead = newNode;
	}
	else
	{
		SLT* ptail = (*pphead);
		//SLT* cur = (*pphead)->next;
		*pphead = newNode;
		newNode->next = ptail;
		ptail = *pphead;
	}
}

🔎头删 :

//头删
void SLTPopFront(SLT** pphead)
{
	if (*pphead == NULL)
	{//释放原空间
		free(*pphead);
		(*pphead) = NULL;
	}
	else
	{//删除
		SLT* ptail = (*pphead)->next;
		if (ptail != NULL)
		{
			(*pphead) = ptail;
		}
		else
		{
			free(*pphead);
			(*pphead) = NULL;
		}
	}
}

🔎查找 :

//查找
SLT* SLTFind(SLT* phead, SLTdataType x)
{
	assert(phead);
	SLT* cur = phead;
	while (cur != NULL)
	{
		//找x
		while (cur->data != x)
		{
		cur = cur->next;
		}
		//找到后,返回地址
		return cur;
	}
	return NULL;
}

🔎在pos位置后插入x :

//在pos位置后插入x
void SLTInsertAfter(SLT* pos, SLTdataType x)
{
	assert(pos);//判断pos位置是否存在
	SLT* newNode = SLTBuy(x);
	newNode->next = pos->next;
	pos->next = newNode;
}

🔎在pos位置前插入x :

//在pos位置前插入x
void SLTInsertFront(SLT** pphead, SLT* pos, SLTdataType x)
{
	assert(pos);
	if (*pphead == pos)
	{
		SLTPushFront(pphead,x);
	}
	else
	{
		SLT* prev = *pphead;
		//找到pos的前一个结点
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		//找到后,添加节点
		SLT* newNode = SLTBuy(x);
		prev->next = newNode;
		newNode->next = pos;
	}
}

🔎删除pos位置后一个指针 :

//删除pos位置后一个指针
void SLTDeleteAfter(SLT* pos)
{
	assert(pos);
	if (pos->next == NULL)
	{
		return ;
	}
	else
	{
		pos->next = pos->next->next;
	}
}

🔎删除pos位置的指针 :

//删除pos位置的指针
void SLTDPosDelete(SLT** pphead, SLT* pos)
{
	//assert(*pphead);//不用断言,如果plist为空,则pos一定为空;可是plist不为空,但是pos可能为空!!!
	assert(pos);
	if (pos == *pphead)
	{
		SLTPopFront(pphead);
	}
	else
	{
		SLT* prev = *pphead;
		//找到pos前一个节点
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		//删除pos结点
		prev->next = pos->next;
		free(pos);
		//pos = NULL;//不用置空,无意义:置空的是形参
	}
}

🔎释放空间 :

//释放空间
void SLTDestory(SLT** pphead)
{
	//结点是一个一个申请的,所以释放的时候也需要一个一个释放!!!
	// 错误示范:
	//free(*pphead);
	//(*pphead)->next = NULL;

	//正确:
	SLT* cur = *pphead;
	while (cur != NULL)
	{
		SLT* next = cur->next;
		free(cur);
		cur = next;
	}
	*pphead = NULL;//头指针此时为野指针,需要置空
}

✔头文件(详情):

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<assert.h>

#define SLTdataType int

//定义结构体
typedef struct SLTnode
{
	SLTdataType data;
	struct  SLTnode* next;
}SLT; 

//为结点申请一个空间
SLT* SLTBuy(SLTdataType x);

//构建n个链表
SLT* SLTCreate(SLTdataType x);

//打印链表
void SLTPrint(SLT* phead);

//尾插
void SLTPushBack(SLT** pphead,SLTdataType x);

//尾删
void SLTPopBack(SLT** pphead);

//头插
void SLTPushFront(SLT** pphead, SLTdataType x);

//头删
void SLTPopFront(SLT** pphead);

//查找
SLT* SLTFind(SLT* phead, SLTdataType x);

//在pos位置后插入x
void SLTInsertAfter(SLT* pos, SLTdataType x);

//在pos位置前插入x
void SLTInsertFront(SLT** pphead,SLT* pos, SLTdataType x);

//删除pos位置后一个指针
void SLTDeleteAfter(SLT* pos);

//删除pos位置的指针
void SLTDPosDelete(SLT** pphead, SLT* pos);

//释放空间
void SLTDestory(SLT** pphead);

✔测试文件(详情):

#define _CRT_SECURE_NO_WARNINGS
#include"SLTNode.h"



test01()
{
	SLT* b1 = SLTBuy(1);
	SLT* b2 = SLTBuy(2);
	SLT* b3 = SLTBuy(3);
	b1->next = b2;
	b2->next = b3;
	SLTPrint(b1);
}

test02()
{
	SLT* plist= SLTCreate(3);
	SLTPrint(plist);
}

test03()
{
	SLT* plist=SLTCreate(3);//0 1 2
	/*int x = 0;
	printf("请输入尾插的数字:");
	scanf("%d",&x);
	SLTPushBack(&plist,x);
	SLTPrint(plist);*/
	//SLTPopBack(&plist);//0 1
	//SLTPrint(plist);
	//SLTPopBack(&plist);//0
	//SLTPrint(plist);
	//SLTPopBack(&plist);//NULL
	//SLTPrint(plist);
}
test04()
{
	SLT* plist = SLTCreate(3);//0 1 2
	//int x = 0;
	//printf("请输入头插的值:");
	//scanf("%d",&x);
	SLTPushFront(&plist,3);
	SLTPrint(plist);

	SLTPopFront(&plist);
	SLTPrint(plist);//0 1 2
	SLTPopFront(&plist);
	SLTPrint(plist);//1 2
	SLTPopFront(&plist);
	SLTPrint(plist);// 2
	SLTPopFront(&plist);
	SLTPrint(plist);//NULL
}
test05()
{
	SLT* plist = NULL;
	SLTPushFront(&plist, 3);
	SLTPushFront(&plist, 2);
	SLTPushFront(&plist, 1);
	SLTPushFront(&plist, 0);
	SLTPrint(plist);//0 1 2 3 NULL

	SLT* pos = SLTFind(plist,3);
	printf("%p\n",pos);//000002866BDFE0E0

	SLTInsertAfter(pos,12);
	SLTPrint(plist);//0 1 2 3 12 NULL
	SLTInsertFront(&plist,pos,11);
	SLTPrint(plist);//0 1 2 11 3 12 NULL

	SLTDeleteAfter(pos);
	SLTPrint(plist);//0 1 2 11 3 NULL

	pos = SLTFind(plist,0);
	SLTDPosDelete(&plist,pos);
	SLTPrint(plist);//0 1 2 11 NULL

}
main()
{
	test05();
	system("pause");
	return 0;
}

感谢家人的阅读,若有不准确的地方 欢迎在评论区指正!

家人们,点个请添加图片描述再走呗~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/425712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大前端突围之路:从RN跨平台到大前端全栈统一

本文首发自「慕课网」(imooc.com)&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;FE大公爵|慕课网讲师 前言 不知不觉&#xff0c;在大前端领域也混迹十年了&#xff0c;一路的经历不敢说…

接口自动化测试yaml+requests+allure技术,你学会了吗?

目录 前言 一、什么是接口自动化测试 二、为什么要进行接口自动化测试 三、接口自动化测试的流程 四、yaml语言介绍 五、requests库介绍 六、allure技术介绍 七、总结 前言 接口自动化测试是在软件开发过程中常用的一种测试方式&#xff0c;通过对接口进行自动化测试&a…

SQL Sever 单表数据查询(下)

提示&#xff1a;本篇文章是在上篇文章的基础上进行单表数据查询操作的补充,主要以例题的方式呈现. 文章目录前言1.分组&#xff1a;统计各门课程的选修人数2.分别统计男女生的平均年龄3.查询所有科目成绩在85分以上的学生的学号及其平均分4.查询平均年龄大于18岁的系部和平均年…

Linux复习 / 动静态库QA梳理 | 如何使用第三方库?

文章目录前言Q&A概念Q&#xff1a;使用静态库和使用动态库的程序有什么区别&#xff1f;Q&#xff1a;什么是静态链接/动态链接&#xff1f;使用与制作Q&#xff1a;如何制作动静态库&#xff1f;Q&#xff1a;如何使用第三方库&#xff1f;Q&#xff1a;程序加载时&#x…

C语言-实现顺序二叉树和平衡二叉树AVL

1. 结构体 在实现二叉树之前先看下结构体的一些使用方法 数组是保存一系列相同的数据。在实际问题中&#xff0c;一组数据往往有很多种不同的数据类型。例如&#xff0c;登记学生的信息&#xff0c;可能需要用到 char型的姓名&#xff0c;int型或 char型的学号&#xff0c;in…

4.6--计算机网络之TCP篇之TCP的基本认识--(复习+深入)---好好沉淀,加油呀

1.TCP 头格式有哪些&#xff1f; 序列号&#xff1a; 在建立连接时由计算机生成的随机数作为其初始值&#xff0c;通过 SYN 包传给接收端主机&#xff0c;每发送一次数据&#xff0c;就「累加」一次该「数据字节数」的大小。 用来解决网络包乱序问题。 确认应答号&#xff1a; …

MySQL优化——Explain分析执行计划详解

文章目录前言一. 查看SQL执行频率二. 定位低效率执行SQL三. explain分析执行计划3.1 id3.2 select_type3.3 table3.4 type3.5 key3.6 rows3.7 extra四. show profile分析SQL前言 在应用的的开发过程中&#xff0c;由于初期数据量小&#xff0c;开发人员写 SQL 语句时更重视功能…

酷炫的3D智慧工厂不会打造?这40+可视化大屏模板千万别错过!

数字化已成为各行各业的重要趋势&#xff0c;因为数字化能够带来精准的效益提升。小米公司最近推进了黑灯工厂业务。”24小时熄灯操作&#xff0c;全程无人工干预”&#xff0c;这是小米智能工厂的重要特征。走进工厂&#xff0c;闪烁的灯带提示生产正在进行&#xff0c;机器通…

【Spring从成神到升仙系列 四】从源码分析 Spring 事务的来龙去脉

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小黄&#xff0c;独角兽企业的Java开发工程师&#xff0c;CSDN博客专家&#xff0c;阿里云专家博主&#x1f4d5;系列专栏&#xff1a;Java设计模式、数据结构和算法、Kafka从入门到成神、Kafka从成神到升仙…

【ChatGPT】Prompt Engineering入门

Prompt Engineering入门一、什么是 Prompt Engineering&#xff1f;二、我们还需要学习 PE 吗&#xff1f;三、Prompt基础原则一、什么是 Prompt Engineering&#xff1f; 简单的理解它是给 AI 模型的指令。它可以是一个问题、一段文字描述&#xff0c;甚至可以是带有一堆参数的…

数据结构 - 排序 | C (插入、希尔、选择、堆、冒泡)

目录0.排序思维导图&#xff08;总&#xff09;一、插入排序1.直接插入排序思路分析代码实现时间复杂度2.希尔排序思路分析代码实现时间复杂度二、选择排序1.选择排序思路分析代码实现时间复杂度2.堆排序思路分析代码实现时间复杂度三、交换排序冒泡排序思路分析代码实现时间复…

如何基于vue实现倒计时效果

如何基于vue实现倒计时效果基于vue2 element实现画面效果代码基于vue2 element 实现画面效果 代码 <template><div><div class"Box"><div style"position: relative;"><el-progress type"circle" :width"30…

pytorch注意力机制

pytorch注意力机制 最近看了一篇大佬的注意力机制的文章然后自己花了一上午的时间把按照大佬的图把大佬提到的注意力机制都复现了一遍&#xff0c;大佬有一些写的复杂的网络我按照自己的理解写了几个简单的版本接下来就放出我写的代码。顺便从大佬手里盗走一些图片&#xff0c…

Vue3使用触摸滑动插件(Swiper)

Vue2使用触摸滑动插件&#xff08;Swiper&#xff09; 参考文档&#xff1a; Swiper官方 Swiper Vue Swiper Demos 本文使用的是最新版本&#xff1a;Swiper9.2.2 安装插件&#xff1a;yarn add swiper 本文基于Swiper插件进行封装&#xff0c;主要实现两种形式的轮播图展示…

电脑自带远程桌面和远程控制软件哪个好?

随着科技的不断发展和普及&#xff0c;越来越多的公司和个人开始关注远程控制软件的使用。我们常常需要在不同的地方工作&#xff0c;但工作需要的文件和软件却只能在一个地方使用&#xff0c;这时候远程控制电脑软件就变得尤为重要咯。但是&#xff0c;许多人分不清楚&#xf…

Windows远程连接工具有哪些

Windows远程连接工具&#xff0c;一般称为远程桌面软件&#xff0c;更准确的叫远程访问软件或远程控制软件&#xff0c;可以让你从一台电脑远程控制另一台电脑。远程桌面软件允许您控制连接的计算机&#xff0c;就好像它就在您面前一样。 远程桌面工具可用于技术支持、远程工作…

单TYPE-C口 可支持快充又可传输USB2.0数据方案

虽然现在有不少厂商也采用了Type-C接口&#xff0c;但是只作为一个充电接口&#xff0c;对于跨时代的type-c接口来说&#xff0c;多少有点大材小用&#xff0c; 那么有没有办法&#xff0c;让一个type-c接口既可以充电&#xff0c;又可以接OTG&#xff1f;比如不充电的时候可以…

Python一行命令搭建HTTP服务器并外网访问 - 内网穿透

文章目录1.前言2.本地http服务器搭建2.1.Python的安装和设置2.2.Python服务器设置和测试3.cpolar的安装和注册3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5.结语转载自远程内网穿透的文章&#xff1a;【Python】快速简单搭建HTTP服务器并公网访问「cpolar内网穿透」 1…

第二章:HTML CSS 网页开发基础(二)

CSS概述 CSS全称&#xff1a;Cascading Style Sheet&#xff0c;可以对文字进行重叠&#xff0c;定位。主要实现页面美化。 一、CSS规则 CSS样式表中包括了3部分&#xff1a;选择符、属性、属性值 选择符{属性:属性值;} 选择符&#xff1a;也可以称为选择器&#xff0c;所有…

Java实现输入行数打印取缔字符,打印金字塔三角形的两个代码程序

目录 前言 一、实现输入行数&#xff0c;打印取缔字符 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 二、打印金字塔三角形 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图​​​​​​​ 前言 1.因多重原因&#xff0c;本博文有…