C语言单链表的增删改补

目录

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

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

 

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

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


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


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

#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  ->  NewNodepcur->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->nextprev->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->nextprev->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.mzph.cn/bicheng/76190.shtml

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

相关文章

Android10.0 framework第三方无源码APP读写断电后数据丢失问题解决

1.前言 在10.0中rom定制化开发中,在某些产品开发中,在某些情况下在App用FileOutputStream读写完毕后,突然断电 会出现写完的数据丢失的问题,接下来就需要分析下关于使用FileOutputStream读写数据的相关流程,来实现相关 功能 2.framework第三方无源码APP读写断电后数据丢…

杀戮尖塔(Slay The Spire) 的全新角色模组 - 女巫

女巫(The Witch) 杀戮尖塔(Slay The Spire) 的全新角色模组 女巫模组为游戏增添了超过 75 张新卡牌和 4 个全新遗物,围绕 诅咒(Curses) 展开独特的玩法体验。她的起始遗物 黑猫(Bl…

AI开发学习路线(闯关升级版)

以下是一份轻松版AI开发学习路线,用「闯关升级」的方式帮你从零开始变身AI开发者,每个阶段都配有有趣的任务和实用资源,保证不枯燥、可落地!👇 目录 🔰 新手村:打基础(1-2个月&…

迭代器模式深度解析与实战案例

一、模式定义 迭代器模式(Iterator Pattern) 是一种行为设计模式,提供一种方法顺序访问聚合对象的元素,无需暴露其底层表示。核心思想是将遍历逻辑从聚合对象中分离,实现 遍历与存储的解耦。 二、核心组件 组件作用…

SSH远程工具

一、常见SSH远程工具 工具开源跨平台多标签文件传输高级功能价格Xshell❌Win✔️✔️脚本、会话管理免费/商业版Tabby✔️全平台✔️✔️插件扩展免费MobaXterm❌Win✔️✔️集成工具集免费/付费SecureCRT❌Win/macOS/Linux✔️✔️企业级加密$129+PuTTY✔️全平台❌❌基础连接…

VUE中的路由处理

1.引入,预处理main.ts import {} from vue-router import { createRouter, createWebHistory } from vue-router import HomePages from @/pages/HomePages.vue import AboutPage from @/pages/AboutPage.vue import NewsPage from @/pages/NewsPage.vue //1. 配置路由规…

编程助手fitten code使用说明(超详细)(vscode)

这两年 AI 发展迅猛,作为开发人员,我们总是追求更快、更高效的工作方式,AI 的出现可以说改变了很多人的编程方式。 AI 对我们来说就是一个可靠的编程助手,给我们提供了实时的建议和解决方,无论是快速修复错误、提升代…

Opencv计算机视觉编程攻略-第九节 描述和匹配兴趣点

一般而言,如果一个物体在一幅图像中被检测到关键点,那么同一个物体在其他图像中也会检测到同一个关键点。图像匹配是关键点的常用功能之一,它的作用包括关联同一场景的两幅图像、检测图像中事物的发生地点等等。 1.局部模板匹配 凭单个像素就…

C++内存管理优化实战:提升应用性能与效率

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle…

17-产品经理-创建发布

点击“发布”-“创建发布”。 填写发布名称,选择测试的版本。还可以设置此次发布是否为“里程碑”。 点击“保存”后,进入该发布详情页面。需要为此次发布关联需求、已解决BUG、以及遗留BUG。可以通过设置条件,进行“搜索”,然后批…

Axure RP9.0教程 | 内联框架 对应html 元素中的iframe标签 (打开内部页面和外部网址)

文章目录 引言I 打开内部页面II 打开外部网址操作效果引言 应用场景: 选择右侧不同栏目,左侧内容发生变化 I 打开内部页面 在公用元件库中找到内联框架图标,将其拖到画布中,设置其宽、高;在右侧添加三个按钮,分别用来跳转三个不同的页面;在内部框架中,添加三个子页面,…

在1panel中安装WebUI

如果需要建站,那得选安装Openresty。点击应用商店,安装 Openresty 接下来安装Ollama,可以部署本地模型提供给WebUi平台使用 最后是安装 WebUi,安装时需要填写Ollama的地址: 容器地址:30000 这些安装都很方便&#xf…

项目难点亮点

Vue项目 RBAC设计 用户权限设置 WebSocket 消息处理 BPMN扩展 跨语言模型的调用 大片文件(影像,模型等,数据-模型集成) 组件&指令封装 低代码表单构建、BPMN编辑器集成与实现 通用参考点 若依(RuoYi)是一个基于 Vue.js 和 Spring Boot 的前后端分离权限管理系…

JVM生产环境调优实战

案例三:JVM频繁Full GC优化 1. 项目背景(Situation) 在云中万维跨境支付的反洗钱系统中,我们负责对海量交易数据进行实时规则校验,以确保符合监管要求。系统日均处理交易量超过500万笔,峰值QPS达到3000&a…

ASP.NET Web 中进行 GET/POST 提交并接收返回数据的几种方案

在 ASP.NET Web 应用程序中进行 GET 请求并接收返回数据可以通过多种方式实现,以下是几种常见的方法: 1. 使用 WebClient 类(简单方式) using System.Net; using System.IO;public string GetDataFromUrl(string url) {using (W…

Springboot--Kafka客户端参数关键参数的调整方法

调整 Kafka 客户端参数需结合生产者、消费者和 Broker 的配置,以实现性能优化、可靠性保障或资源限制。以下是关键参数的调整方法和注意事项: 一、生产者参数调整 ‌max.request.size‌ ‌作用‌:限制单个请求的最大字节数(包括消…

Android学习总结之service篇

引言 在 Android 开发里,Service 与 IntentService 是非常关键的组件,它们能够让应用在后台开展长时间运行的操作。不过,很多开发者仅仅停留在使用这两个组件的层面,对其内部的源码实现了解甚少。本文将深入剖析 Service 和 Inte…

ExternalProject_Add 使用手册与文档详解

一、基本概念与语法 ExternalProject_Add 是 CMake 的一个核心命令,用于在构建过程中集成和管理外部项目(如第三方库)。它支持完整的生命周期管理,包括下载、配置、构建、安装和测试。 语法: ExternalProject_Add(&l…

低延迟云网络的核心技术

低延迟云网络通过架构优化、协议创新、硬件加速等多维度技术手段,将数据传输延迟降低至毫秒级甚至微秒级。 1. 网络架构优化 1.1 扁平化网络Leaf-Spine 架构 减少网络层级,缩短数据转发路径(如数据中心内部一跳可达)。 扁平化网络Leaf-Spine(叶子-脊椎)架构是一种现代…

网络安全法规与入门指南

在当今数字化时代,网络安全已成为保障个人隐私、企业利益和国家安全的关键领域。随着网络攻击的日益复杂和频繁,了解和遵守网络安全法规变得尤为重要。本文将深入探讨网络安全相关法规,并为想要进入这一领域的读者提供实用的入门指南。 一、…