【C语言数据结构】单链表

目录

  • 分析顺序表和链表
  • 实现单链表
    • 打印链表
    • 动态申请一个节点
    • 尾插
    • 头插
    • 尾删
    • 头删
    • 查找值函数
    • 单链表在pos位置之前插入x
    • 单链表在pos位置之后插入x
    • 删除pos位置
    • 单链表删除pos位置之后的值
    • 释放内存空间

分析顺序表和链表

如下图可以看出顺序表的优点
1.尾插尾删足够快
2.下标随机访问和修改方便
但是也能看出一些问题
1.由于顺序表是连续存放的,所以顺序表的头部和中部的插入删除的效率都不行(相比于链表)
2.空间不够,扩容会有一定的消耗
3.可能还存在空间浪费的问题
链表可以解决顺序表的这些问题。对于链表空间是一个一个分开存放的,链表的上一个元素只要保存要访问的下一个元素的地址即可。在申请内存时也不需要申请一整块内存空间,只需要在插入元素时申请所需要的内存大小即可。
下面我们来实现一个单链表。在这里插入图片描述

实现单链表

打印链表

要打印出链表,首先定义一个结构体指针cur让这个结构体指针和phead指针同时指向第一个节点,创建完cur后,只需要判断该节点在while循环中指针不为空即可。不断把cur->nextD的值赋值给cur,然后打印cur节点,就完成了整个链表的遍历。
请添加图片描述

动态申请一个节点

动态申请一个节点最要注意的是需要申请的malloc的大小
在这里插入图片描述

尾插

尾插的常见错误分析:

1.tail通过while循环判断条件错误导致尾插失败
判断条件写成cur != NULL
在这里插入图片描述
正确结果是找到NULL的前一个节点,通过tail->next指向newnode,这样出了函数tail和newnode局部变量销毁也不会影响整个链表。
在这里插入图片描述在这里插入图片描述

但是如果链表一开始是空的呢?
2.链表为空时,改变phead的值但是尾插失败
在这里插入图片描述-----
在这里插入图片描述-----
在这里插入图片描述-----

分析:在这里插入图片描述----------
在这里插入图片描述
改变int要传int*,改变int*要传int**
得出结论:改变结构体要用结构体指针,改变结构体指针要用结构体指针的指针(二级指针)。

总结:当链表不为空时,只要改变tail->next,tail->next是结构体,所以只需要结构体的指针即可,链表为空时,我们要改变的是结构体指针plist,所以要用结构体指针的指针。

头插

头插不管链表为不为空都很明显需要用到二级指针。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

尾删

尾删首先要考虑的问题是这个地方需不需要用到二级指针?对于数据结构的学习我们要考虑全面一些,如果尾删对于有多个节点的链表不需要用到二级指针,但是只有一个节点要怎么删除呢?答案还是要用到二级指针。尾删的时候链表为空还要尾删吗?所以这个地方还要考虑判断链表为不为空。

链表为空,我们只需要加一个断言即可。
在这里插入图片描述

链表只有一个节点
在这里插入图片描述在这里插入图片描述

链表有多个节点
尾删首先要找尾,这里有一个常见错误
在这里插入图片描述
为了避免这种问题,有两种写法
1.定义一个tailprev找tail之前的位置,把tail指向的空间free,把tailprev的next置空。
在这里插入图片描述
2.在判断循环条件部分判断tail->next->next是否为空,释放tail->next,
把tail->next的值置空。
在这里插入图片描述

头删

头删只有两种情况,一种是空链表,一种是非空链表
在这里插入图片描述

查找值函数

这里可以传一级指针也可以传二级指针,因为我们不需要修改值。
在这里插入图片描述
利用find函数我们找到了节点的地址就可以修改当前节点的值。在这里插入图片描述

单链表在pos位置之前插入x

在pos 位置之前插入,先要判断pos的位置,如果pos在头结点位置,就是头插我们可以复用头插的函数。这里pos在尾结点不用单独判断。在这里插入图片描述

单链表在pos位置之后插入x

在这里插入图片描述

删除pos位置

在这里插入图片描述

单链表删除pos位置之后的值

在这里插入图片描述

释放内存空间

在这里插入图片描述

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

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

相关文章

Git安装与常用命令

Git简介: Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目。Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。Git与常用的版本控制工具CVS、Subversion等不同,它采用了分布式…

zsh和ohmyzsh安装指南+插件推荐

文章目录 1. 安装指南2. 插件配置指南3. 参考信息 1. 安装指南 1. 安装 zsh sudo apt install zsh2. 安装 Oh My Zsh 国内访问GitHub sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"这将安装 Oh My Zsh 和所…

验证码案例 —— Kaptcha 插件介绍 后端生成验证码,前端展示并进行session验证(带完整前后端源码)

🧸欢迎来到dream_ready的博客,📜相信你对这篇博客也感兴趣o (ˉ▽ˉ;) 📜表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手…

强烈 推荐 13 个 Web前端在线代码IDE

codesandbox.io(国外,提供免费空间) 网址:https://codesandbox.io/ CodeSandbox 专注于构建完整的 Web 应用程序,支持多种流行的前端框架和库,例如 React、Vue 和 Angular。它提供了一系列增强的功能&…

【数据预处理2】数据预处理——数据标准化

数据标准化 1. 什么是标准化?   数据标准化是一个常用的数据预处理操作,目的是将不同规格的数据转换到统一规格或不同分布的数据转换到某个特定范围,以减少规模、特征、分布差异等对模型的影响。这种操作也叫作无量纲化。   除了用作模型…

<MySQL> 如何合理的设计数据库中的表?数据表设计的三种关系

目录 一、表的设计 二、一对一关系 三、一对多关系 四、多对多关系 一、表的设计 数据库设计就是根据需要创建出符合需求的表。 首先根据需求找到体系中的关键实体对象,通常每个实体对象都会有一个表,表中包含了这个实体的相关属性。 再理清楚实体对…

Java Web——JavaScript运算符与流程语句

1. 运算符 1.1. 算数运算符 数字是用来计算的,比如:乘法 * 、除法 / 、加法 、减法 - 等等,所以经常和算术运算符一起。 算术运算符:也叫数学运算符,主要包括加、减、乘、除、取余(求模)等 …

C语言的由来与发展历程

C语言的起源可以追溯到上世纪70年代,由Dennis Ritchie在贝尔实验室开发出来。C语言的设计目标是提供一种简洁、高效、可移植的编程语言,以便于开发底层的系统软件。在那个时代,计算机技术正在迅速发展,出现了多种高级编程语言&…

神经网络反向传播的数学原理

如果能二秒内在脑袋里解出下面的问题,本文便结束了。 已知:,其中。 求:。 到这里,请耐心看完下面的公式推导,无需长久心里建设。 首先,反向传播的数学原理是“求导的链式法则” : 设f和g为x…

SpringBoot 整合 Freemarker

通过 Freemarker 模版,我们可以将数据渲染成 HTML 网页、电子邮件、配置文件以及源代码等。 Freemarker 不是面向最终用户的,而是一个 Java 类库,我们可以将之作为一个普通的组件嵌入到我们的产品中。 Freemarker 模版后缀为 .ftl(FreeMarke…

PC端使子组件的弹框关闭

子组件 <template><el-dialog title"新增部门" :visible"showDialog" close"close"> </el-dialog> </template> <script> export default {props: {showDialog: {type: Boolean,default: false,},},data() {retu…

9 HDFS架构剖析

问题 100台服务器&#xff0c;存储空间单个200GB 20T 5T文件如何存储&#xff1f; 128MB一块 128MB81GB 1288*10241TB 5T数据分成的128MB的块数 8192 * 5 客户端(client)代表用户通过与namenode和datanode交互来访问整个文件系统。 HDFS集群有两类节点&#xff1a; 一个na…