【数据结构】 单向链表的实现

单向链表是数据结构中的一种,它由节点组成,每个节点包含两个部分:数据域和指针域。数据域用于存储节点的值,指针域则用于指向下一个节点。单向链表的特点是只能从头节点开始遍历到尾节点,不能反向遍历。

1 单向链表的节点定义

typedef struct node
{int data; //数据域 用来存放数据 整型struct node * next; //指针域 用来存放下一个节点的首地址
}link_node_t;
单向链表的操作 ( 有头的单向链表 )
//1. 创建一个空的链表 createEmpty()
//2. 遍历链表的有效元素 showLinknode()
//3. 求链表的长度 getLen()
//4. 向链表的指定位置插入数据 insertInto
//5. 判断链表是否为空 , 空返回 1 ,未空返回 0 isEmpty()
//6. 删除链表指定位置的数据 deleteFrom()
//7. 查找指定数据,出现在链表中的位置 findData()
//8. 清空链表 clear()

2.创建一个空的链表 

//1.创建一个空的链表(本质上只有一个头节点链表,将头节点的首地址返回)
link_node_t* createEmptyLinklist()
{//创建一个空的头节点link_node_t* p = malloc(sizeof(link_node_t));if(p == NULL){printf("createEmptyLinklist malloc failed!!\n");return NULL;//表达申请失败}//申请空间,就是为了装东西p->next = NULL;//指针域初始化为NULL,数据域不用初始化,因为头节点数据域无效//将头节点的首地址返回return p;
}

3.遍历有头链表的有效元素

void showLinklist(link_node_t* p)
{while(p->next != NULL){p = p->next;printf("%d ",p->data);}printf("\n");
}

4.求链表的长度  

int getLengthLinklist(link_node_t* p)
{int len = 0;//统计长度while(p->next != NULL){p = p->next;len++;//打印一次,就计数一次}return len;
}

5.判断链表是否为空,空返回1,未空返回0

//6. 判断链表是否为空 空返回1,未空返回0
int isEmptyLinklist(link_node_t* p)
{//p指向头节点//p->next代表头节点的指针域,头节点的指针域为空,说明后面什么没有了return p->next == NULL ? 1 : 0;
}

6.向链表的指定位置插入数据

编程思想 :
0. 容错判断( post <= 0 || post > getLinkLen ( p ) + 1
1. 创建新的节点,保存插入的数据 x 也就是 100
2. 将头指针移动到插入位置的前一个位置
3. 将新的节点插入 ( 先连后面,再连前面 )
int insertIntoLinklist(link_node_t* p, int post, int x)
{int i;//0.容错判断if(post < 1 || post > getLengthLinklist(p)+1){printf("insertIntoLinklist failed!!\n");return -1;}//1.创建一个新的节点,保存插入的数据xlink_node_t* pnew = malloc(sizeof(link_node_t));if(pnew == NULL){printf("pnew malloc failed!!\n");return -1;}//申请空间,就是为了装东西,立刻装东西pnew->data = x;pnew->next = NULL;//准备开始插入//2.将头指针指向(移动)插入位置的前一个位置for(i = 0; i < post-1; i++)p = p->next;//3.将新节点插入链表(先连后面,再连前面)pnew->next = p->next;//连后面p->next = pnew;//连前面return 0;
}

7.删除链表指定位置的数据

编程思想 :
1. 将头指针移动到删除位置的前一个位置
2. 定义一个指针,指向被删除节点
3. 跨过被删除节点
4. 释放被删除节点
int deleteFromLinklist(link_node_t* p, int post)
{//0.容错判断if(post < 1 || post > getLengthLinklist(p) || isEmptyLinklist(p)){printf("deleteFromLinklist failed!!\n");return -1;}//1. 将头指针移动到删除位置的前一个位置int i;for(i = 0; i < post-1; i++)p = p->next;//2.定义了指针变量4个字节,指向被删除节点link_node_t* pdel = p->next;//3.跨过被删除节点p->next = pdel->next;//4. 释放被删除节点free(pdel)pdel = NULL;return 0;
}

8.清空链表

编程思想:
1. 将头指针移动到删除位置的前一个位置 可以不写
2. 定义了指针变量 4 个字节 , 指向被删除节点
3. 跨过被删除节点
4. 释放被删除节点
void clearLinklist(link_node_t* p)
{//砍头思想:每次删除的是头节点的下一个节点while(p->next != NULL)//只要链表不为空,就执行删除操作 p->next == NULL循环结束,此时是空的表{//1. 将头指针移动到删除位置的前一个位置//第一步可以省略不写,因为每次删除的是头节点的下一个节点,//那么头节点就是每次被删除节点的前一个位置//2.定义了指针变量4个字节,指向被删除节点link_node_t* pdel = p->next;//3.跨过被删除节点p->next = pdel->next;//4. 释放被删除节点free(pdel);pdel = NULL;}
}

9.查找指定数据x出现的位置

int searchDataLinklist(link_node_t* p, int x)
{int post = 0;while(p->next != NULL){p = p->next;post++;//用来记录第几个if(p->data == x)return post;//返回值是第几个}return -1;//不存在
}

结语

以上就是单向链表的基本使用,本次代码分享到此结束,后续还会分享单向链表的尾插法以及头插法。最后的最后,还请大家点点赞,点点关注,谢谢大家!

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

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

相关文章

深入剖析图像平滑与噪声滤波

噪声 在数字图像处理中&#xff0c;噪声是指在图像中引入的不希望的随机或无意义的信号。它是由于图像采集、传输、存储或处理过程中的各种因素引起的。 噪声会导致图像质量下降&#xff0c;使图像失真或降低细节的清晰度。它通常表现为图像中随机分布的亮度或颜色变化&#…

面试不慌张:一文读懂FactoryBean的实现原理

大家好&#xff0c;我是石头~ 在深入探讨Spring框架内部机制时&#xff0c;FactoryBean无疑是一个关键角色&#xff0c;也是面试中经常出现的熟悉面孔。 不同于普通Java Bean&#xff0c;FactoryBean是一种特殊的Bean类型&#xff0c;它的存在并非为了提供业务逻辑&#xff0c;…

docker-002常用命令

启动类命令 启动systemctl start docker停止systemctl stop docker重启systemctl restart docker查看状态systemctl status docker开机启动systemctl enable docker概要docker info总体帮助文档docker --help命令帮助文档docker 具体命令 --help镜像命令 查看主机上的镜像 命令…

基于Springboot的小区物业管理系统

基于SpringbootVue的小区物业管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 用户管理 员工管理 业主信息管理 费用信息管理 楼房信息管理 保修信息…

【原创教程】海为PLC与RS-WS-ETH-6传感器的MUDBUS_TCP通讯

一、关于RS-WS-ETH-6传感器的准备工作 要完成MODBUS_TCP通讯,我们必须要知道设备的IP地址如何分配,只有PLC和设备的IP在同一网段上,才能建立通讯。然后还要选择TCP的工作模式,来建立设备端和PC端的端口号。接下来了解设备的报文格式,方便之后发送报文完成数据交互。 1、…

自定义Blazor单文件Web程序端口

#接 上篇 Mysql快速迁移版的制作过程# 上一篇《Mysql8快速迁移版的制作过程》完成了快速迁移的数据库的准备&#xff0c;今天接着讲基于Blazor的Web程序快速迁移版的制作。 单文件发布的难点不在发布而是因为程序系统默认给了个5001的端口&#xff0c;而是如何能够让用户自定…

AOP基础-动态代理

文章目录 1.动态代理1.需求分析2.动态代理的核心3.代码实例1.Vehicle.java2.Car.java3.Ship.java4.VehicleProxyProvider.java(动态代理模板)5.测试使用 2.动态代理深入—横切关注点1.需求分析2.四个横切关注点3.代码实例1.Cal.java2.CalImpl.java3.VehicleProxyProvider02.jav…

0-1背包问题:贪心算法与动态规划的比较

0-1背包问题&#xff1a;贪心算法与动态规划的比较 1. 问题描述2. 贪心算法2.1 贪心策略2.2 伪代码 3. 动态规划3.1 动态规划策略3.2 伪代码 4. C语言实现5. 算法分析6. 结论7. 参考文献 1. 问题描述 0-1背包问题是组合优化中的一个经典问题。假设有一个小偷在抢劫时发现了n个…

CSS继承、层叠和特殊性

继承性 CSS样式的相互传递&#xff0c;也就是说CSS内部标签拥有CSS外部标签的某些样式。我们可以利用CSS的继承性先把网页中具有相同&#xff0c;可继承的样式提取出来&#xff0c;然后进行全局中定义&#xff0c;利用继承属性影响整个页面的样式。 CSS中不可以继承的属性 1…

(C语言)sscanf 与 sprintf详解

目录 1.sprintf函数详解 2. sscanf函数详解 1.sprintf函数详解 头文件&#xff1a;stdio.h 作用&#xff1a;将格式化的数据写入字符串里&#xff0c;也就是将格式化的数据转变为字符串。 演示&#xff1a; #include <stdio.h> struct S {char name[10];int height;…

L1-039 古风排版--Python

中国的古人写文字&#xff0c;是从右向左竖向排版的。本题就请你编写程序&#xff0c;把一段文字按古风排版。 输入格式&#xff1a; 输入在第一行给出一个正整数N&#xff08;<100&#xff09;&#xff0c;是每一列的字符数。第二行给出一个长度不超过1000的非空字符串&a…

【QT进阶】Qt http编程之http与https简单介绍

往期回顾 【QT进阶】Qt Web混合编程之html、 js的简单交互-CSDN博客 【QT进阶】Qt Web混合编程之使用ECharts显示各类折线图等-CSDN博客【QT进阶】Qt Web混合编程之实现ECharts数据交互动态修改-CSDN博客 【QT进阶】Qt http编程之http与https简单介绍 一、什么是http与https …

NX二次开发——矩形排料5(基于最低水平线+遗传算法排料策略实现)

目录 一、概述 二、知识回顾 2.1适应度函数的确定 2.2基因编码 2.3遗传算法复制&#xff08;选择&#xff09; 2.4遗传算法交叉操作 通过交叉操作可以增加种群个体的多样性&#xff0c;既可以产生更多的优秀解。下面通过顺序编码方法进行改进&#xff08;网上有很…

ThreadLocal 实战使用详解

ThreadLocal 知识储备传送门&#xff1a; ThreadLocal 原理及源码详解 ThreadLocal 内存泄漏和常见问题详解 什么是ThreadLocal&#xff1f; ThreadLocal 是一种提供线程本地变量&#xff08;也称为线程局部变量&#xff09;的类&#xff0c;这种变量确保了在不同的线程中访…

vue3:树的默认勾选和全选、取消全选

实现的功能&#xff0c;上面有个选择框&#xff0c;当选中全部时&#xff0c;下方树被全选 代码&#xff1a; <template><div><el-select v-model"selectAll" style"margin-bottom: 10px;" change"handleSelectAllChange">&…

electron打包dist为可执行程序后记【electron-quick-start】

文章目录 目录 文章目录 前言 一、直接看效果 二、实现步骤 1.准备dist文件夹 2.NVM管理node版本 3.准备electron容器并npm run start 4.封装成可执行程序 1.手动下载electron对应版本的zip文件&#xff0c;解决打包缓慢问题 2.安装packager 3.配置打包命令执行内容…

嵌入式linux中利用QT控制蜂鸣器方法

大家好,今天给大家分享一下,如何控制开发板上的蜂鸣器。 第一:开发板原理图 从原理图中可以得出,当引脚输出低电平的时候,对应的蜂鸣器发出响声。 第二:QT代码详细实现 设置一个按钮,点击即可控制BEEP状态发生反转。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#in…

华为鸿蒙生态,威力估计被很多人低估了……

华为鸿蒙生态&#xff0c;威力估计被很多人低估了&#xff01;华为的鸿蒙千帆计划快成了&#xff0c;微信的加盟让计划就基本没问题了。 最近华为公布原生鸿蒙APP进度&#xff0c;在TOP5000应用里面&#xff0c;已经有4000支持了&#xff0c;不是已经开发完成&#xff0c;就是…

c++ 继承和组件的区别

一、什么是继承(Inheritance) 继承是面向对象编程的四大基本特性之一&#xff0c;它允许一个类&#xff08;派生类或子类&#xff09;继承另一个类&#xff08;基类或父类&#xff09;的属性和方法。通过继承&#xff0c;子类可以重用父类的代码&#xff0c;并且可以添加或覆盖…

# C++之STL整理(9)之list用法(创建、赋值、增删查改)详解

C之STL整理&#xff08;9&#xff09;之list用法&#xff08;创建、赋值、增删查改&#xff09;详解 注&#xff1a;整理一些突然学到的C知识&#xff0c;随时mark一下 例如&#xff1a;忘记的关键字用法&#xff0c;新关键字&#xff0c;新数据结构 C 的list用法整理 C之STL整…