C语言单链表的增删改补

news2025/4/18 1:49:26

目录

(一)单链表的结构定义及初始化

(二)单链表的尾插,头插

 

(三)单链表的尾删,头删

(四)单链表的查找,删除,销毁


单链表是数据结构课程里的第二个数据结构。单链表在逻辑结构是连续的,在物理结构不一定连续。因为在单链表的每一个结点的内存是在堆区动态开辟的,由操作系统来决定是否连续开辟在相同的区域。


(一)单链表的结构定义及初始化

#define SLDataType int

//单链表的结构定义
typedef struct SingleList
{
    SLDataType val;
    struct SingleList* next;
}SL;

单链表的每一个节点都有其数值域和指针域。数值域是当前结点所存储的数值,指针域是存储指向下一个结点的指针。这里我们定义一个宏,把SLDataType 替换成int,以后想换存储的数据类型就方便多了。我们再把单链表的数据类型struct SingleList重命名为SL。

//单链表的初始化
void InitSingleList(SL* phead)
{
    assert(phead);
    phead->val = 0;
    phead->next = NULL;
}

(二)单链表的尾插,头插

单链表的尾插是指在单链表的结尾插进去一个新结点。我们可以创建一个函数专门封装创建一个新结点的过程

//创建一个新结点
SL* BuyNewNode(SLDataType x)
{
    SL* NewNode = (SL*)malloc(sizeof(SL));
    if (NewNode == NULL)
    {
        perror("malloc fail!\n");
        eixt(1);    
    }
    //走到这说明新结点的内存创建成功
    NewNode->val = x;
    NewNode->next = NULL;
    return NewNode;
}

每次创建结点的时候必须要检查结点是否创建失败,而且要记得要释放空间。我们这里通过malloc申请了一片SL大小的空间。并将申请的空间解释为SL*类型,把SL里面的值赋值为x,下一个结点指向为NULL指针。

//单链表的尾插
void SingleListPushBack(SL** pphead, SLDataType x)
{
    //这里需要用二级指针,因为可能传进来的指针没有结点,尾插变成头插,需要对头结点的地址进行赋值。
    assert(pphead);
    SL* phead = *pphead;
    if (phead == NULL)
    {
        //说明单链表没有一个结点,需要修改头结点的地址
        phead = BuyNewNode(x);
        
    }
    else
    {
        //需要遍历链表找到尾结点
        SL* pcur = phead;
        while (pcur)
        {
            pcur = pcur->next;
        }
        //我们要让链表后面的顺序为   pcur  ->  NewNode
        pcur->next = BuyNewNode(x);
    }
}
//单链表的头插
void SingleListPushFront(SL** pphead, SLDataType x)
{   
    assert(pphead);
    //同样的头插就更需要传二级指针了
    SL* phead = *pphead;
    //NewNode  -> phead;
    SL* NewNode = BuyNewNode(x);
    
    NewNode->next = phead;
    phead = NewNode;
}

(三)单链表的尾删,头删

同样的操作

//单链表的尾删
void SingleListPopBack(SL** pphead)
{
    assert(pphead && *phead);
    SL* phead = *pphead;
    //如果单链表只有一个结点
    if (phead-> next == NULL)
    {
        free(phead);
        phead = NULL;
    }
    else
    {
        //需要遍历查找链表尾部
        SL* pcur = phead;
        SL* prev = NULL;
        while (pcur->next)
        {
            prev = pcur;
            pcur = pcur->next;
        }
        //  pcur  pcur->next
        prev->next = NULL;
        free(pcur->next);
        pcur->next = NULL;
    }
}
//单链表的头删
void SingleListPopFront(SL** pphead)
{   
    assert(pphead && *pphead);
    SL* phead = *pphead;
    // phead phead->next;
    SL* next = phead->next;
    free(phead);
    phead = next;
}

(四)单链表的查找,删除,销毁
//单链表的查找
SL* FindSingleList(SL* phead, SLDataType x)
{
    assert(phead);
    SL* pcur = phead;
    while (pcur)
    {    
        if (pcur->val == x)
            return pcur;
        pcur = pcur->next;
    }
    return NULL;
}
//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pphead && pos);
	//pos就是头结点
	if (pos == *pphead)
	{
		SLTPopFront(pphead);
	}
	else {
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		//prev pos pos->next
		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}
}
//单链表的销毁
void SListDestroy(SLTNode** pphead)
{
	SLTNode* pcur = *pphead;
	while (pcur)
	{
		SLTNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}
	*pphead = NULL;
}

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

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

相关文章

redis导入成功,缺不显示数据

SpringBootTest class SecurityApplicationTests {AutowiredStringRedisTemplate template; //添加这句代码,自动装载,即可解决文章三处代码报错Testvoid contextLoads() {String compact Jwts.builder().signWith(Jwts.SIG.HS512.key().build()).subj…

从表格到序列:Swift 如何优雅地解 LeetCode 251 展开二维向量

文章目录 摘要描述题解答案题解代码分析示例测试及结果时间复杂度空间复杂度总结 摘要 在这篇文章中,我们将深入探讨 LeetCode 第 251 题——“展开二维向量”的问题。通过 Swift 语言,我们不仅会提供可运行的示例代码,还会结合实际场景进行…

小型园区网实验

划分VLAN SW3 [sw3]vlan batch 2 3 20 30 [sw3]interface GigabitEthernet 0/0/1 [sw3-GigabitEthernet0/0/1]port link-type access [sw3-GigabitEthernet0/0/1]port default vlan 2 [sw3-GigabitEthernet0/0/1]int g0/0/2 [sw3-GigabitEthernet0/0/2]port link-type acces…

c# 数据结构 链表篇 有关单链表的一切

本人能力有限,本文仅作学习交流与参考,如有不足还请斧正 目录 0.单链表好处 0.5.单链表分类 1.无虚拟头节点情况 图示: 代码: 头插/尾插 删除 搜索 遍历全部 测试代码: 全部代码 2.有尾指针情况 尾插 全部代码 3.有虚拟头节点情况 全部代码 4.循环单链表 几个…

VS Code连接服务器编写Python文件

1、下载 Visual Studio Code 2、打开扩展(ctrl shift x ) 3、搜索 Remote - SSH,安装 4、F1 或者 点金左下角 5、选择:Remote-SSH: Connect to Host……,回车 6、第一次用的时候,VS Code 会提示添加 SSH 主机。输…

Gitea的安装和配置以及应用

Gitea的安装和配置以及应用 一、安装 1、创建数据库和数据库账户(pg) su – postgres -c "psql" CREATE ROLE gitea WITH LOGIN PASSWORD gitea; CREATE DATABASE giteadb WITH OWNER gitea TEMPLATE template0 ENCODING UTF8 LC_COLLATE …

$_GET变量

$_GET 是一个超级全局变量,在 PHP 中用于收集通过 URL 查询字符串传递的参数。它是一个关联数组,包含了所有通过 HTTP GET 方法发送到当前脚本的变量。 预定义的 $_GET 变量用于收集来自 method"get" 的表单中的值。 从带有 GET 方法的表单发…

TBE(TVM的扩展)

算子 张量 一个张量只有一种数据类型 在内存中只能线性存储,最终形成一个长的一维数组 晟腾AI的数据格式 AIPP是对我们常见的数据格式转化成AI core支持的数据格式 广播机制 TVM TBE的第一种开发方式:DSL TBE的第二种开发方式:TVM TBE的第…

【Function Calling与Tool Calling】深度解析大模型智能中枢的架构革命

目录 一、范式转移:从对话引擎到智能中枢 二、核心技术解析 2.1 Function Calling技术栈 2.2 Tool Calling实现模式 三、企业级应用架构设计 3.1 智能工单系统案例 3.2 性能优化策略 四、安全与治理框架 4.1 权限控制矩阵 4.2 审计追踪设计 五、开发者实…

知识表示方法之六:过程表示法(Procedural Representation)

在人工智能的发展史中,关于知识的表示方法曾存在两种不同的观点。一种观点认为知识主要是陈述性的,其表示方法应着重将其静态特性,即事物的属性以及事物间的关系表示出来,称以这种观点表示知识的方法为陈述式或说明式表示法&#…

sql-labs靶场 less-2

文章目录 sqli-labs靶场less 2 联合注入 sqli-labs靶场 每道题都从以下模板讲解,并且每个步骤都有图片,清晰明了,便于复盘。 sql注入的基本步骤 注入点注入类型 字符型:判断闭合方式 (‘、"、’、“”&#xf…

git clone(复制)下载

1、复制 下载地址 2、打开网页,点击 克隆/下载按扭 3、按提示复制命令行到终端 4、VS里打开终端,并粘贴以下命令 5、 下载完毕 6、复制文件夹到你选定的位置 7、用VSCODE打开文件夹,开始你接下来的工作

Android设置adjustResize时无法生效 解决办法

删除Activity类下执行全屏的一行参数。 将图中这段Activity类中执行命令给删除就解决了。 注意关闭后状态栏和导航栏的透明度就无法自动处理了&#xff0c;需要到values和values-night下的themes.xml手动设置状态栏背景颜色。 <item name"android:statusBarColor"…

按键长按代码

这些代码都存放在定时器中断中。中断为100ms中断一次。 数据判断&#xff0c;看的懂就看吧

优选算法第八讲:链表

优选算法第八讲&#xff1a;链表 1.链表常用操作和技巧总结2.两数相加3.两两交换链表中的节点4.重排链表5.合并k个升序链表6.k个一组翻转链表 1.链表常用操作和技巧总结 2.两数相加 3.两两交换链表中的节点 4.重排链表 5.合并k个升序链表 6.k个一组翻转链表

4S店汽车维修保养管理系统 (源码+lw+部署文档+讲解),源码可白嫖!

摘要 二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式已经与当今4S店汽车维修保养管理系统的业务需求不相适应,也与4S店汽车维修保养管理系统化建设的发展趋势不相适应。本文针对这一需求设计并实现了…

【NLP 面经 8】

目录 一、文本生成任务 模型架构方面 训练数据方面 生成策略方面 二、命名实体识别任务NER 模型架构方面 特征工程方面 训练优化方面 三、情感分析任务 模型架构方面 训练数据方面 超参数调整方面 四、计算余弦相似度并添加符合条件结果 提示&#xff1a; 思路与算法 任由深渊的…

UE5学习笔记 FPS游戏制作43 UI材质

文章目录 实现目标制作UI材质使用UI材质 实现目标 把图片变为灰色 制作UI材质 右键新建一个材质 左侧细节栏&#xff0c;材质域改为用户界面&#xff0c;混合模式改为半透明 此时输出节点应该有两个属性 在内容浏览器里找到要用的图片&#xff0c;然后向上拖动到材质标题…

12、主频和时钟配置实验

一、I.MX6U 时钟系统详解 1、系统时钟来源 开发板的系统时钟来源于两部分: 32.768KHz 和24MHz 的晶振,其中 32.768KHz 晶振是 I.MX6U 的 RTC 时钟源, 24MHz 晶振是 I.MX6U 内核和其它外设的时钟源。 2、7路PLL时钟源 I.MX6U 的外设有很多,不同的外设时钟源不同, NXP 将…

2025 年河北交安安全员考试:巧用行业报告丰富知识储备​

河北交通行业发展迅速&#xff0c;各类行业报告蕴含大量有价值信息。考生可从河北省交通运输行业发展报告、安全专项检查报告等资料入手。在行业发展报告中&#xff0c;了解本省交通建设规模、重点项目规划等内容&#xff0c;这些信息与交安安全员工作紧密相关。比如&#xff0…