数据结构---顺序表之单链表

1.链表的概念

链表是一种逻辑上是线性的,但物理结构不一定是线性的数据结构,它通过链表中的指针链接次序实现的

链表的存储空间是我们通过动态内存开辟的内存空间,所以他们的地址可能是连续的也可能不是连续的

2.链表的分类

1.单向或者双向

2.带头或者不带头

3.循环或者不循环

虽然链表有这么多种类,单我们常用的就只有两种:

                                               单向不带头不循环链表(单链表)

                                                   双向带头循环链表(双链表)

3.单链表的实现

SList.h

// 1、无头+单向+非循环链表增删查改实现
typedef int SLTDateType;
typedef struct SListNode
{SLTDateType data;struct SListNode* next;
}SListNode;
// 动态申请一个结点
SListNode* BuySListNode(SLTDateType x);
// 单链表打印
void SListPrint(SListNode* plist);
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x);
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x);
// 单链表的尾删
void SListPopBack(SListNode** pplist);
// 单链表头删
void SListPopFront(SListNode** pplist);
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x);
// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
void SListInsertAfter(SListNode* pos, SLTDateType x);
// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
void SListEraseAfter(SListNode* pos);

SList.c

//为什么这里要用二级指针?
//因为我们的头结点是一个结构体指针,我们可能会改变头结点,所以我们需要传结构体地址的地址// 动态申请一个结点
SListNode* BuySListNode(SLTDateType x) {SListNode* NewNode = (SListNode*)malloc(sizeof(SListNode));if (NewNode == NULL) {return 0;}NewNode->next = NULL;NewNode->data = x;return NewNode;
}
// 单链表打印
void SListPrint(SListNode* plist) {SListNode* pcur = plist;while (pcur) {printf("%d->", pcur->data);pcur = pcur->next;}printf("NULL\n");
}
// 单链表尾插
void SListPushBack(SListNode** pplist, SLTDateType x) {assert(pplist);SListNode* NewNode = BuySListNode(x);//如果链表为NULL,头结点就是NewNodeif (*pplist == NULL) {*pplist = NewNode;return;}//链表不为NULL,找到尾节点插入SListNode* pcur = *pplist;while (pcur->next) {pcur = pcur->next;}pcur->next = NewNode;
}
// 单链表的头插
void SListPushFront(SListNode** pplist, SLTDateType x) {assert(pplist);SListNode* NewNode = BuySListNode(x);SListNode* pcur = *pplist;NewNode->next = pcur;*pplist = NewNode;
}
// 单链表的尾删
void SListPopBack(SListNode** pplist) {assert(pplist);//链表为NULL不能执行删除assert(*pplist);//如果链表只有1个节点if ((*pplist)->next == NULL) {free(*pplist);*pplist = NULL;return;}SListNode* pcur = *pplist;SListNode* prev = NULL;while (pcur->next) {prev = pcur;pcur = pcur->next;}prev->next = pcur->next;free(pcur);pcur = NULL;
}
// 单链表头删
void SListPopFront(SListNode** pplist) {assert(pplist);assert(*pplist);SListNode* pcur = *pplist;*pplist = pcur->next;free(pcur);pcur = NULL;}
// 单链表查找
SListNode* SListFind(SListNode* plist, SLTDateType x) {assert(plist);SListNode* pcur = plist;while (pcur) {if (pcur->data == x) {return pcur;}pcur = pcur->next;}//未找到返回NULLreturn NULL;
}
// 单链表在pos位置之后插入x
// 分析思考为什么不在pos位置之前插入?
//因为单链表的节点只能找后继结点,不能找前驱
void SListInsertAfter(SListNode* pos, SLTDateType x) {assert(pos);SListNode* NewNode = BuySListNode(x);NewNode->next = pos->next;pos->next = NewNode;
}
// 单链表删除pos位置之后的值
// 分析思考为什么不删除pos位置?
// 如果链表存在多个节点,pos节点之前的节点就会丢失,造成内存泄露
void SListEraseAfter(SListNode* pos) {assert(pos);assert(pos->next);SListNode* DeleNode = pos->next;pos->next = DeleNode->next;free(DeleNode);DeleNode = NULL;
}

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

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

相关文章

Footprint Analytics: 我们为何打造 Growthly 这款产品

在 Web3 的领域内,数据已成为新的“财富”。在 Footprint Analytics,我们始终站在区块链数据分析的最前沿,提供全方位的解决方案,为 Web3 生态中的企业和项目简化数据分析的复杂性。然而,随着我们对客户需求及行业趋势…

VLAN原理与接口

在学习之前,先抛出问题:什么是VLAN?VLAN工作原理是什么?VLAN如何配置? VLAN的定义 VLAN(Virtual Local Area Network,虚拟局域网)是一种在逻辑上将局域网设备从物理上划分的网络技…

一种单目标A*算法设计与实现

一种单目标A*算法设计与实现 作者:吴屏珊 最近在学习简单的单目标A*算法,其中在CSDN上阅读到的一篇博文给了我很大启发,于是在该博文的基础上,笔者记录了一点自己对于A*算法的体会和感悟。原文链接 目录 文章目录 一种单目标A*…

微信接口报错:Http头Authorization中的timestamp与 发起请求的时间不得超过5分钟

在发起请求的时候微信会自己封装一个系统时间 当服务器系统时间与实际实际相差5分钟或者5分钟以上就会出现这个错误 需要修改系统时间 问一下ChatGPT 用自动同步 sudo timedatectl set-ntp true 服务器执行 , 过个一分钟 再查看时间 发现正确 再支付就可以成功…

Spring6梳理11——依赖注入之注入List集合类型属性

以上笔记来源: 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)https://www.bilibili.com/video/BV1kR4y1b7Qc 11 依赖注入之注入List集合类型属性 11.1 创建实体类Emp以及Dept Dept类中添加了遍历Emp…

Java语法-类和对象(上)

1. 面向对象的初步认识 1.1 什么是面向对象 概念: Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。 1.2 面向对象VS面向过程 如:洗衣服 面向过程: 注重的是洗衣服的过程,少了一个环节也不…

七层负载均衡和四层负载均衡的区别

文章目录 什么是七层负载均衡?一、定义与工作原理二、优点与缺点三、应用场景四、常见七层负载均衡器五、负载均衡算法 什么是四层负载均衡?一、定义与原理定义:原理: 二、特点与应用场景特点:应用场景: 三…

python类的call方法与init方法

1. call方法 在对象被调用了的时候就会调用call方法a(666) class A:def __call__(self, args):print(call 方法被调用了,args) aA() a(666) 2.init方法 创建对象的时候 init 方法被调用 class A:def __init__(self,args):print(创建对象的时候 init 方法被调用了,args) aA(…

三、LLM应用开发准备工作

LLM应用开发准备工作 开发基础开发工具大模型kx上网key的配置与使用网站结语 开发基础 最好具备一定的Python开发基础,不需要特别深 如果不具备,可以先学习一下基础知识(概念),比如Python环境管理、包管理与使用、基本…

城市酷选:如何四年做到3000亿销售额 会员超500w

城市酷选,这一融合了线上线下消费的会员制社交电商平台,正以其独特的运营模式在市场中崭露头角。该平台不仅汇聚了超过600万的会员与60万商家,更实现了年交易额的百亿突破,彰显了其强大的市场影响力和消费者吸引力。 创新排队免单…

必应bing推广kai户流程教学,满足企业获客需求

微软Bing广告提供了三种主要广告类型,可以满足大多数出海企业的展示和客户获取需求。 搜索广告(Search Ads) 包括标准搜索广告和动态搜索广告。当用户的搜索词与投放的关键词匹配时,相应的搜索广告会被触发,向用户展示…

基于深度学习的数字识别系统的设计与实现(python、yolov、PyQt5)

💗博主介绍💗:✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示:文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

Nginx 的优化与防盗链设置

Nginx的优化 隐藏版本号 暴露版本号,攻击者就可以根据版本漏洞进行攻击。 查看版本号的方法: curl -I http://192.168.110.60 网页访问F12查看源代码 隐藏版本号的方法 方法一、修改配置文件 添加关闭版本号 vim /usr/local/nginx/conf/nginx.conf…

构建高效企业客户管理系统:SpringBoot应用

1 绪论 1.1研究背景 随着网络不断的普及发展,企业客户管理系统依靠网络技术的支持得到了快速的发展,首先要从员工的实际需求出发,通过了解员工的需求开发出具有针对性的首页、个人中心、员工管理、客户信息管理、行业类型管理、项目信息管理、…

心觉:早上醒来是先冥想还是先洗漱,如何提高冥想的质量

Hi,我是心觉,与你一起玩转潜意识、脑波音乐和吸引力法则,轻松掌控自己的人生! 挑战每日一省写作179/1000天 很多人在学习冥想的时候会有一个疑惑? 都知道在半睡半醒的状态下冥想效果最好 那么早上醒来之后&#xf…

【全新课程】正点原子《ESP32物联网项目实战》培训课程上线!

正点原子《ESP32物联网项目实战》全新培训课程上线啦!正点原子工程师手把手教你学!通过多个项目实战,掌握ESP32物联网项目的开发! 一、课程介绍 本课程围绕物联网实战项目展开教学,内容循序渐进,涵盖了环…

人工智能在医疗健康领域的应用与展望

随着技术的发展,人工智能(Artificial Intelligence, AI)正逐渐渗透到各行各业之中,其中医疗健康领域因其对人类福祉的重要性而备受关注。AI技术的应用不仅能够提高医疗服务的质量和效率,还能促进医学研究的进步&#x…

<刷题笔记> 二叉搜索树与双向链表注意事项

二叉搜索树与双向链表_牛客题霸_牛客网 (nowcoder.com) 根据题意,我们需要将搜索二叉树转换成有序的形式。 重点一:BST的中序遍历一定是有序的 因此,此题无论如何都需要使用中序。 又因为要求原地算法,所以: 重点二&a…

ChatGPT 提取文档内容,高效制作PPT、论文

随着人工智能生成内容(AIGC)的快速发展,利用先进的技术工具如 ChatGPT 的 RAG(Retrieval-Augmented Generation,检索增强生成)模式,可以显著提升文档内容提取和内容创作的效率。以下将详细介绍如…

Windows内核编程基础(1)

在前面的文章中,介绍了如何配置开发环境以及如何进行调试。 接下来的几篇文章,将会重点介绍内核编程中所需要了解的一些理论基础。 我写这个系列文章的主要目的是方便以后自己查阅,同时也给正在学习内核开发的小伙伴一些参考,所…