目录

1.链表的概念及结构

2.单链表的应用

2.1 打印链表

2.2申请新节点

2.3插入(尾删和头删)

2.4删除(尾删和头删)

2.5查找

2.6任意位置插入

2.7删除指定位置的元素

2.8 销毁链表

3.总结


1.链表的概念及结构

(1)概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。与顺序表的区别在于链表的空间是要一个给一个,不在是内存空间溢出时将内存空间*2.

(2)结构:

struct SListNode
{int data; //节点数据struct SListNode* next; //指针变量⽤保存下⼀个节点的地址
};

链表是由节点组成的,节点包含节点数据和下一个节点的地址。按照顺序打印结构如下。

2.单链表的应用

2.1 打印链表

通过while (pcur)来判断是否到达链表结尾NULL,pcur = pcur->next将下一跳的地址赋值到pcur来达到循环。

void SLTPrint(SLTNode* phead)
{SLTNode* pcur = phead;while (pcur){printf("%d->", pcur->data);pcur = pcur->next;}printf("NULL\n");
}

2.2申请新节点

定义一个新的结构体指针来完成,用元素的扩容(插入)。

SLTNode* SLTBuyNode(SLTDataType x)
{SLTNode* node = (SLTNode*)malloc(sizeof(SLTNode));if (node == NULL){perror("malloc fail!");exit(1);}node->data = x;node->next = NULL;return node;
}

2.3插入(尾删和头删)

为什么要用双指针(SLTNode** pphead):
        使用双指针 SLTNode** pphead,通过 *pphead = newnode 可以直接修改调用者传递的头指针地址,从而更新链表的头节点。如果使用单指针,只能修改局部变量phead的值,无法修改链表的地址。

        总结就是,pphead只是形参,要想通过修改形参来改变实参就必须传实参的地址。

//尾插
void SLTPushBack(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);if (*pphead == NULL){*pphead = newnode;}else{SLTNode* pcur = *pphead;while (pcur->next){pcur = pcur->next;}pcur->next = newnode;}
}
//头插
void SLTPushFront(SLTNode** pphead, SLTDataType x)
{assert(pphead);SLTNode* newnode = SLTBuyNode(x);if (*pphead == NULL){*pphead = newnode;}else{newnode->next = *pphead;}*pphead = newnode;
}

2.4删除(尾删和头删)

链表重新连接好后要释放掉删除部分的地址(free)

//尾删
void SLTPopBack(SLTNode** pphead)
{assert(pphead && *pphead);if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLTNode* ptail = *pphead;SLTNode* pcur = NULL;while (ptail->next){pcur = ptail;ptail = ptail->next;}pcur->next = NULL;free(ptail);ptail = NULL;}
}
//头删
void SLTPopFront(SLTNode** pphead)
{assert(pphead && *pphead);if ((*pphead)->next == NULL){free(*pphead);*pphead = NULL;}else{SLTNode* ptail = *pphead;SLTNode* pcur = ptail->next;free(ptail);ptail = NULL;*pphead = pcur;}
}

2.5查找

通过比对data来找到pos的地址。

这里我调试时出现返回的pos1地址传到我新建立的结构体指针中,高位不一致,但低位一致,问题产生的主要原因是,头文件中函数没有定义,我给注释掉了。

SLTNode* SLTFind(SLTNode* phead, SLTDataType x)
{assert(phead);SLTNode* pos1 = phead;while (pos1 != NULL){if (pos1->data == x){return pos1;}pos1 = pos1->next;}return NULL; // 未找到或链表为空时返回 NULL
}

2.6任意位置插入

//在指定位置之前插⼊数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{assert(pphead);assert(pos);if (pos == *pphead){SLTPushFront(pphead, x);}else{SLTNode* newnode = SLTBuyNode(x);SLTNode* pcur = *pphead;while (pcur->next != pos){pcur = pcur->next;}newnode->next = pos;pcur->next = newnode;}
}
//在指定位置之后插⼊数据
void SLTInsertAfter(SLTNode* pos, SLTDataType x)
{assert(pos);SLTNode* newnode = SLTBuyNode(x);newnode->next = pos->next;pos->next = newnode;
}

2.7删除指定位置的元素

//删除pos结点
void SLTErase(SLTNode** pphead, SLTNode* pos)
{assert(pphead);assert(pos);SLTNode* pcur = *pphead;while (pcur->next != pos){pcur = pcur->next;}pcur->next = pos->next;
}
//删除pos之后的结点
void SLTEraseAfter(SLTNode* pos)
{assert(pos);if (pos->next == NULL){printf("POS后没有元素\n");return;}else{ SLTNode* pcur = pos->next;pos->next = pcur->next;free(pcur);                // 释放被删除节点的内存pcur = NULL;               // 防止悬空指针}}

2.8 销毁链表

//销毁链表
void SListDestroy(SLTNode** pphead)
{free(*pphead);*pphead = NULL;
}

3.总结

        主要完成了单链表的插,删,查等功能,编写过程中掌握调试的基本方法。原代码地址在我的gitee仓库中,有需要可以下载查看。https://gitee.com/lisien123/c_learn/tree/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/25-8-31%E5%8D%95%E9%93%BE%E8%A1%A8

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

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

相关文章

电脑没加域却能获取到IP地址

企业网络管理的核心逻辑!电脑没加域却能获取到IP地址,这完全是一种刻意为之的安全设计,而不是网络故障。 简单来说就是:“给你IP,但不给你权限。” 这背后是一套完整的 网络准入控制(NAC) 策略。…

Go语言入门学习笔记

📚 前言 欢迎学习Go语言!这份教材假设您是编程零基础,从最基本的概念开始讲解。Go语言(也称为Golang)由Google开发,简单、高效、并发能力强,适合后端开发、系统编程和云计算。 学习建议&#xf…

gradle安装、配置环境变量、配置阿里源及idea 中配置gradle

下载gradle https://services.gradle.org/distributions/ 配置系统环境变量 新增GRADLE_HOME D:\Information_Technology\App\gradle-8.14.3-bin\gradle-8.14.3 新增GRADLE_USER_HOME D:\Information_Technology\App\gradleHouse 设置 path,新增一行 %GRADLE_…

C# FlaUI win 自动化框架,介绍

一、简洁介绍 FlaUI 是一套基于 .NET 的 Windows 桌面应用自动化测试库,支持 Win32、WinForms、WPF、UWP 等多种类型的应用。它基于微软原生 UI Automation 库,提供了更现代、易用的 API,适合自动化测试工程师和开发者实现高效、可维护的 UI …

命名空间级别应用 Pod 安全标准

🎯 命名空间级别应用 Pod 安全标准 一、创建 Kubernetes 集群(使用 kind) 使用 kind (Kubernetes IN Docker)快速创建一个本地集群: kind create cluster --name my-cluster验证集群是否运行正常&#xff1…

Ubuntu 25.10 Snapshot4 发布。

Ubuntu 25.10 的第四个快照(Snapshot 4)已于 2025 年 8 月 28 日发布,供开发者和测试人员进行验证。这是 Ubuntu 25.10 正式发布前的最后一个月度快照,标志着该版本已进入功能冻结阶段,预计将在 10 月发布正式版。 Ca…

STM32F2/F4系列单片机解密和芯片应用介绍

STM32F2/F4系列单片机解密和芯片应用介绍STM32F2和STM32F4系列微控制器凭借其出色的性能、丰富的外设接口和强大的连接能力,在很多对计算能力和实时性有要求的领域都有应用。同时,芯片解密的价格因其型号、加密技术等因素差异较大。🧭 重要提…

250901-BookStack跨服务器从Rootless-Docker到Rootful-Docker的备份迁移及服务启动

下面给你一套「可离线、最小停机」的迁移步骤,从 A(rootless)搬到 B(rootful)。思路是:停 A → 打包数据卷 → 传到 B → 还原 → 用同版本镜像启动 → 验证。整套操作不依赖公网,只用你已有的离…

(Redis)Redis 分布式锁及改进策略详解

一、为什么需要分布式锁在单机应用中,synchronized 或 ReentrantLock 足以解决并发问题。但在 分布式系统 中,多台服务器之间共享同一个资源时,如果没有锁,很可能出现 超卖、重复扣减、数据不一致 等问题。 因此,分布式…

Linux应用开发-windows,linux环境下相关工具

VS Code Remote - SSH 虚拟机部分的操作 sudo systemctl status sshsudo apt update sudo apt install openssh-server sudo systemctl start ssh sudo systemctl enable ssh # 设置开机自启hostname -IVS Code部分的操作 安装 Remote - SSH 插件 vscode右下角出现&#xff…

Java泛型通配符详解:搞懂?/extends/super用法,避开集合操作踩坑点

上次跟你们聊了泛型的基础用法,今天接着往下说 —— 泛型里还有个挺重要的概念叫 “通配符”,就是那个问号 “?”,很多人第一次见都懵:这玩意儿跟普通泛型有啥区别?为啥有时候非得用它不可?小索奇当初也卡…

EXCEL开发之路(二)跨表交互模拟—仙盟创梦IDE

在车辆租赁行业,数据的高效管理与分析对于企业的运营决策、资源调配及客户服务优化至关重要。自建 Excel 实现多表统计交互,如同为行业装上了效能驱动引擎,助力企业在复杂多变的市场环境中稳健前行。一、精准资源管理,优化车辆调配…

医疗AI时代的生物医学Go编程:高性能计算与精准医疗的案例分析(八)

5.4 性能测试与结果分析 为了评估GoEHRStream的性能,我们设计测试模拟真实的医院数据流场景,并测量关键指标。 5.4.1 实验环境 硬件: CPU: Intel Xeon E-2288G (8 cores, 16 threads) RAM: 32 GB DDR4 Storage: 512 GB NVMe SSD (用于GoEHRStream和BadgerDB) Network: 1 G…

开关电源设计“反馈回路”部分器件分析

目录 主要分析问题如下: 一、问题1 二、问题二 分析电路如下: 主要分析问题如下: 1、分析TL431芯片1、2两引脚间并联电阻和电容(RC电路)的作用? 2、PC817A光耦输入两个引脚间并联电阻的作用?…

AI 编程新玩法:用 yunqi-saas-kit 框架制作小游戏,看广告变现轻松赚钱​

AI 编程新玩法:用 yunqi-saas-kit 框架制作小游戏,看广告变现轻松赚钱 在数字经济快速发展的当下,AI 技术正不断渗透到各个领域,其中 **#AI 编程凭借高效、便捷的优势,成为不少开发者和创业者的新选择。尤其是在小游戏…

Kafka 架构原理

一个kafka集群中包含一个或多个Producer、一个或多个broker、一个或多个ConsumerGrop以及一个Zookeeper集群。kafka通过Zookeeper管理kafka集群配置、leader副本的选举、生产者的负载均衡等。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅并消费消…

用 PyTorch 搭建 CNN 实现 MNIST 手写数字识别

在图像识别领域,卷积神经网络(CNN) 凭借其对空间特征的高效提取能力,成为手写数字识别、人脸识别等任务的首选模型。而 MNIST(手写数字数据集)作为入门级数据集,几乎是每个深度学习学习者的 “第…

CTFshow系列——命令执行web61-68

本篇文章介绍了不同了方法进行题目的解析以及原因讲解。 文章目录Web61尝试了一下,被过滤的payload如下:所以,根据上述思路,这里尝试过的payload为:Web62(同Web61)Web63(同Web62&…

.Net程序员就业现状以及学习路线图(二)

一、.NET程序员就业现状分析 1. 市场需求与岗位分布 2025年.NET开发岗位全国招聘职位约1676个,占全国技术岗位的0.009%,主要集中在一线城市如深圳、上海等地。就业单位类型分布为:软件公司占43.3%,研发机构占33.1%,物联…

MTK Linux DRM分析(二十二)- MTK mtk_drm_crtc.c(Part1)

一、代码分析 mtk_drm_crtc.c以mtk_crtc_comp_is_busy函数为界限进行拆分分析 static const struct drm_crtc_funcs mtk_crtc_funcs = {.set_config = drm_atomic_helper_set_config,.page_flip = drm_atomic_helper_page_flip,.destroy = mtk_drm_crtc_destroy,.reset = mtk…