数据结构--单链表代码(王道书上代码手敲!!!)c++

目录

1.带头结点的初始化以及检查单链表是否为空

2.不带头结点的单链表初始化以及表是否为空检查

3.带头结点按位序插入

4.不带头结点的按位序插入

5.带头结点的后插,前插,按位删除,删除固定节点操作

6 不带头结点的后插,前插,按位删除,删除固定节点操作,


注意!!!以下代码是在c++环境中写的c代码,用了c++代码的&

1.带头结点的初始化以及检查单链表是否为空

代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>//带头节点的单链表
//定义结构体变量
typedef struct LNode {int data;struct LNode* next;
}lNode,*LinkList;//初始化
bool InitList(LinkList &L ) {//申请一篇空间来存储存储头节点,并使L指向这个节点L = (LNode*)malloc(sizeof(LNode));if (L == NULL)return false;L->next = NULL;return true;
}//检查单链表是否为空
bool Empty(LinkList L) {return (L->next==NULL);}int main() {
//定义头指针LinkList L;InitList(L);printf("查看单链表是否为空:%s\n", Empty(L) ? "是" : "否");return 0;
}

结果:

2.不带头结点的单链表初始化以及表是否为空检查

代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//不带头节点的单链表
//定义结构体变量
typedef struct LNode {int data;struct LNode *next;
} LNode,*LinkList;//初始化单链表
bool InitList(LinkList &L) {//头指针赋值为空L = NULL;return true;
}//判断单链表是否为空
bool Empty(LinkList L) {return (L == NULL);}int main() {LinkList L;InitList(L);printf("查看单链表是否为空:%s\n",Empty(L) ? "是":"否");return 0;
}

结果:

3.带头结点按位序插入

代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>//带头节点的单链表
//定义结构体变量
typedef struct LNode {int data;struct LNode* next;
}lNode,*LinkList;//初始化
bool InitList(LinkList &L ) {//申请一篇空间来存储存储头节点,并使L指向这个节点L = (LNode*)malloc(sizeof(LNode));if (L == NULL)return false;L->next = NULL;return true;
}//检查单链表是否为空
bool Empty(LinkList L) {return (L->next==NULL);}//插入,在第i个位置插入元素e
bool InsertList(LinkList& L, int i, int e) {//判断i范围是否合法if (i < 1)return false;//定义一个指针指向当前扫描的结点,使其刚开始指向头结点(L在初始化的时候指向了头结点),LNode* p = L;int j = 0;//定义当前p指向的是第几个结点while (p != NULL && j < i - 1) {//此函数是为了寻找第i-1个节点p = p->next;j++;}//处理当插入位置的前一个节点(即第 i−1 个节点)不存在if (p == NULL)return false;LNode *s = (LNode *)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return true;
}int main() {
//定义头指针LinkList L;InitList(L);printf("查看单链表是否为空:%s\n", Empty(L) ? "是" : "否");return 0;
}

结果跟上回一样,就不展示了

4.不带头结点的按位序插入

代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
//不带头节点的单链表
//定义结构体变量
typedef struct LNode {int data;struct LNode *next;
} LNode,*LinkList;//初始化单链表
bool InitList(LinkList &L) {//头指针赋值为空L = NULL;return true;
}//判断单链表是否为空
bool Empty(LinkList L) {return (L == NULL);}bool ListInsert(LinkList& L,int i,int e ) {if (i < 1)return false;//处理在第一个节点处插入if (i == 1) {LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = L;L = s;return true;}//处理在除第一个节点外插入,先找到该节点的前一个节点LNode* p;//指针p指向当前扫描到的节点int j = 1;//当前p指向的是第几个节点p = L;//p指向第1个节点(注意不是头结点)while (p != NULL && j < i - 1) {p = p->next;j++;}if (p == NULL)//i太大return false;LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return true;
}int main() {LinkList L;InitList(L);printf("查看单链表是否为空:%s\n",Empty(L) ? "是":"否");return 0;
}

结果和上回一样,就不贴图了

5.带头结点的后插,前插,按位删除,删除固定节点操作

代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>//带头节点的单链表
//定义结构体变量
typedef struct LNode {int data;struct LNode* next;
}lNode,*LinkList;//添加函数原型的声明
bool InitList(LinkList& L);
bool Empty(LinkList L);
bool InsertList(LinkList& L, int i, int e);
bool InsertNestNode(LNode* p, int e);
bool InsertPriorNode(LNode* p, int e);
bool ListDelete(LinkList& L, int i, int& e);
bool DeleteNode(LNode* p, int& e);
bool PrintList(LinkList L);//初始化
bool InitList(LinkList &L ) {//申请一篇空间来存储存储头节点,并使L指向这个节点L = (LNode*)malloc(sizeof(LNode));if (L == NULL)return false;L->next = NULL;return true;
}//检查单链表是否为空
bool Empty(LinkList L) {return (L->next==NULL);}//插入,在第i个位置插入元素e
bool InsertList(LinkList& L, int i, int e) {//判断i范围是否合法if (i < 1)return false;//定义一个指针指向当前扫描的结点,使其刚开始指向头结点(L在初始化的时候指向了头结点),LNode* p = L;int j = 0;//定义当前p指向的是第几个结点while (p != NULL && j < i - 1) {//此函数是为了寻找第i-1个节点p = p->next;j++;}return InsertNestNode(p, e);
}//指定节点的后插操作,在p节点之后插入元素e
bool InsertNestNode(LNode *p, int e) {//处理当插入位置的前一个节点不存在if (p == NULL)return false;LNode* s = (LNode *)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next= s;return true;
}//前插操作:在p结点前面插入元素e,(还是后插,只是把里面的数据换一下顺序)
bool InsertPriorNode(LNode *p,int e) {if (p == NULL)return false;LNode* s = (LNode*)malloc(sizeof(LNode));s->next = p->next;	s->data = p->data;	//将p中的元素复制到s中p->next = s;	//新节点s连到p之后p->data = e;	//p中元素覆盖为ereturn true;
}//按位序删除
bool ListDelete(LinkList& L, int i, int& e) {if (i < 1)return false;LNode* p;p = L;int j = 0;while (p != NULL && j < i - 1) {p = p->next;j++;}if (p == NULL)return false;if (p->next == NULL)return false;LNode* q = p->next;p->next = q->next;e=q->data;free(q);return true;
}//删除指定节点p
bool DeleteNode(LNode* p, int& e) {//此方法不能删除最后一个节点!注意,只能传入头指针从头遍历来删除最后的结点LNode* q = p->next;if(p == NULL||q==NULL)return false;p->data = q->data;	//和后继节点交换数据域p->next = q->next;	//将*q结点从链中“断开”free (q);			//释放后继节点的存储空间return true;
}//打印单链表的元素
bool PrintList(LinkList L) {LNode* p = L;while (p != NULL) {printf("%d\n", p->data);p = p->next;}printf("NULL\n");return true;
}int main() {// 定义头指针LinkList L;InitList(L);printf("查看单链表是否为空:%s\n", Empty(L) ? "是" : "否");// 插入一些元素InsertList(L, 1, 10);InsertList(L, 2, 20);InsertList(L, 3, 30);InsertList(L, 2, 15); // 插入在第二个位置printf("链表内容:");PrintList(L);// 删除一些元素int e;ListDelete(L, 2, e); // 删除第二个位置的元素printf("删除第二个位置的元素:%d\n", e);printf("链表内容:");PrintList(L);// 在第一个节点前插入元素InsertPriorNode(L->next, 5);printf("在第一个节点前插入5:");PrintList(L);// 删除指定节点DeleteNode(L->next, e);printf("删除第一个节点后的节点,其值为:%d\n", e);printf("链表内容:");PrintList(L);return 0;}

结果:

6 不带头结点的后插,前插,按位删除,删除固定节点操作,

注:也就按位删除和带头结点的有区别,因为得考虑第一个节点

代码:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <malloc.h>
//不带头节点的单链表
//定义结构体变量
typedef struct LNode {int data;struct LNode *next;
} LNode,*LinkList;//添加函数原型的声明
bool InitList(LinkList& L);
bool Empty(LinkList L);
bool InsertList(LinkList& L, int i, int e);
bool InsertNestNode(LNode* p, int e);
bool InsertPriorNode(LNode* p, int e);
bool ListDelete(LinkList& L, int i, int& e);
bool DeleteNode(LNode* p, int& e);
bool PrintList(LinkList L);//初始化单链表
bool InitList(LinkList &L) {//头指针赋值为空L = NULL;return true;
}//判断单链表是否为空
bool Empty(LinkList L) {return (L == NULL);}bool InsertList(LinkList& L,int i,int e ) {if (i < 1)return false;//处理在第一个节点处插入if (i == 1) {LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = L;L = s;return true;}//处理在除第一个节点外插入,先找到该节点的前一个节点LNode* p;//指针p指向当前扫描到的节点int j = 1;//当前p指向的是第几个节点p = L;//p指向第1个节点(注意不是头结点)while (p != NULL && j < i - 1) {p = p->next;j++;}return InsertNestNode(p, e);
}//后插操作
bool InsertNestNode(LNode* p, int e) {//处理当插入位置的前一个节点不存在if (p == NULL)return false;LNode* s = (LNode*)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return true;
}//前插操作:在p结点前面插入元素e,(还是后插,只是把里面的数据换一下顺序)
bool InsertPriorNode(LNode* p, int e) {if (p == NULL)return false;LNode* s = (LNode*)malloc(sizeof(LNode));s->next = p->next;s->data = p->data;	//将p中的元素复制到s中p->next = s;	//新节点s连到p之后p->data = e;	//p中元素覆盖为ereturn true;
}//按位序删除
bool ListDelete(LinkList& L, int i, int& e) {if (i < 1)return false;// 删除第一个节点的特殊处理if (i == 1) {if (L == NULL)return false;LNode* q = L;e = L->data;L = L->next;free(q);return true;}LNode* p;p = L;int j = 0;while (p != NULL && j < i - 1) {p = p->next;j++;}if (p == NULL)return false;if (p->next == NULL)return false;LNode* q = p->next;p->next = q->next;e = q->data;free(q);return true;
}//删除指定节点p
bool DeleteNode(LNode* p, int& e) {//此方法不能删除最后一个节点!注意,只能传入头指针从头遍历来删除最后的结点LNode* q = p->next;if (p == NULL || q == NULL)return false;p->data = q->data;	//和后继节点交换数据域p->next = q->next;	//将*q结点从链中“断开”free(q);			//释放后继节点的存储空间return true;
}//打印单链表的元素
bool PrintList(LinkList L) {LNode* p = L;while (p != NULL) {printf("%d\n", p->data);p = p->next;}printf("NULL\n");return true;
}int main() {// 定义头指针LinkList L;InitList(L);printf("查看单链表是否为空:%s\n", Empty(L) ? "是" : "否");// 插入一些元素InsertList(L, 1, 10);InsertList(L, 2, 20);InsertList(L, 3, 30);InsertList(L, 2, 15); // 插入在第二个位置printf("链表内容:");PrintList(L);// 删除一些元素int e;ListDelete(L, 2, e); // 删除第二个位置的元素printf("删除第二个位置的元素:%d\n", e);printf("链表内容:");PrintList(L);// 在第一个节点前插入元素InsertPriorNode(L->next, 5);printf("在第一个节点前插入5:");PrintList(L);// 删除指定节点DeleteNode(L->next, e);printf("删除第一个节点后的节点,其值为:%d\n", e);printf("链表内容:");PrintList(L);return 0;
}

结果:
 结束~


有收获的宝宝留个赞赞再走吧~ 

不胜感激~

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

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

相关文章

SLAM:BALM: 激光雷达映射的捆绑调整【方法解析-1】

目录 摘要I. 引言II. 相关工作III. BA公式及其导数A. 直接BA公式摘要 在视觉SLAM中,滑动窗口关键帧上的局部束调整(BA)已被广泛使用,并被证明在降低漂移方面非常有效。但在激光雷达SLAM中,很少使用BA方法,因为稀疏特征点(如边缘和平面)使得精确的点匹配变得不可能。在…

如何在 SpringBoot 中优雅的做参数校验?

一、故事背景 关于参数合法性验证的重要性就不多说了&#xff0c;即使前端对参数做了基本验证&#xff0c;后端依然也需要进行验证&#xff0c;以防不合规的数据直接进入服务器&#xff0c;如果不对其进行拦截&#xff0c;严重的甚至会造成系统直接崩溃&#xff01; 本文结合…

【Qt】QWidget核心属性相关API

目录 一. enabled——是否可用 二. geometry——几何位置 window frame 三. windowTitle——窗口标题 四. windowIcon——窗口图标 ​qrc文件 五. windowOpacity——透明度 六. cursor——光标 自定义光标 七. font——字体 八. toolTip——提示栏 九. focusPolic…

Web开发:ASP.NET CORE中前端使用Ajax定时获取后端数据

一、低难度&#xff08;刷新a标签&#xff09; 1、需求 给a标签每15s刷新一次&#xff0c;显示最新的时间&#xff08;时间必须由后端获取&#xff09; 应该如何操作呢 2、代码 后端 using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Mi…

液态神经网络到底是什么?

液体神经网络是一种应用范围极其广泛的机器学习工具&#xff0c;不仅可以像传统神经网络那样学习并执行图像识别、自然语言处理和语音合成等多种任务&#xff1b;还突破了传统神经网络难以适应随时间变化的新数据的限制&#xff0c;能够应用于医学诊断和自动驾驶等涉及动态和不…

【Plotly-驯化】一文教你通过plotly画出动态可视化多变量分析:create_scatterplotmatrix

【Plotly-驯化】一文教你通过plotly画出动态可视化多变量分析&#xff1a;create_scatterplotmatrix 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &am…

无法解析插件 org.apache.maven.plugins:maven-war-plugin:3.2.3(已解决)

文章目录 1、问题出现的背景2、解决方法 1、问题出现的背景 最开始我想把springboot项目转为javaweb项目&#xff0c;然后我点击下面这个插件 就转为javaweb项目了&#xff0c;但是我后悔了&#xff0c;想要还原成springboot项目&#xff0c;点开项目结构关于web的都移除了&am…

MySql 触发器、存储器练习

一&#xff1a; 触发器 1、建立两个表:goods(商品表)、orders(订单表) 查看数据库&#xff1a;mysql> show databases; 使用数据库&#xff1a;mysql> use mydb16_trigger; 创建goods表&#xff1a; mysql> create table goods(gid char(8) not null primary key, …

海外发稿:打造希腊媒体宣发新局面

随着全球经济一体化的不断深入&#xff0c;企业对于海外市场的拓展需求日益迫切。在这个过程中&#xff0c;媒体宣发作为一种有效的市场推广手段&#xff0c;已经成为企业出海的重要策略之一。希腊&#xff0c;作为欧洲的重要经济体&#xff0c;拥有丰富的文化底蕴和众多的历史…

自动IP地址vs固定IP地址:哪个更快?深度解析与比较

在数字化时代&#xff0c;网络连接已成为我们日常生活和工作中不可或缺的一部分。而在网络配置中&#xff0c;IP地址的选择——无论是自动获取还是固定设置&#xff0c;都是影响网络性能和管理的关键因素之一。许多人常常疑惑&#xff1a;自动IP地址和固定IP地址哪个快一点&…

Linux中如何用ida调试fork后的子进程

原文链接 > https://redqx.github.io/linux/2024/07/24/linux-debugfork.html 本文的一些图片引用可能有一些问题, 比如数据不对劲,但无伤大雅 自己懒得粘贴图片了 环境: wsl-kali-2024 ida-7.7 插件: Lazy_ida, 还有一个什么插件不知道什么名字, 可以把汇编转字节码 …

基于PaddleClas的人物年龄分类项目

目录 一、任务概述 二、算法研发 2.1 下载数据集 2.2 数据集预处理 2.3 安装PaddleClas套件 2.4 算法训练 2.5 静态图导出 2.6 静态图推理 三、小结 一、任务概述 最近遇到个需求&#xff0c;需要将图像中的人物区分为成人和小孩&#xff0c;这是一个典型的二分类问题…

DLMS/COSEM中公开密钥算法的使用_椭圆曲线加密法

1.概述 椭圆曲线密码涉及有限域上的椭圆曲线上的算术运算。椭圆曲线可以定义在任何数字域上(实数、整数、复数)&#xff0c;但在密码学中&#xff0c;椭圆曲线最常用于有限素数域。 素数域上的椭圆曲线由一组实数(x, y)组成&#xff0c;满足以下等式: 方程的所有解的集合构成…

7月23日JavaSE学习笔记

异常&#xff1a; 程序中一些程序处理不了的特殊情况 异常类 Exception 继承自 Throwable 类&#xff08;可抛出的&#xff09; Throwable继承树 Error&#xff1a;错误/事故&#xff0c;Java程序无法处理&#xff0c;如 OOM内存溢出错误、内存泄漏...会导出程序崩溃 常见的…

结构拼图的艺术——组合模式(Python实现)

大家好&#xff0c;今天我们继续来讲结构型设计模式&#xff0c;上一期我们介绍了桥接模式&#xff0c;帮助大家理解了如何通过分离抽象部分和实现部分来实现代码的解耦。 今天&#xff0c;我们将介绍另一个非常实用的设计模式——组合模式&#xff0c;这个模式特别适合用于处…

Vue实现简单小案例

一、创建文件夹 二、引用vue.js <script src"../js/vue.js"></script> 三、准备一个容器 <div id"app"><h1>Hello,{{name}}</h1> </div> 四、创建实例 <script>new Vue({el:"#app", //el用于指…

Godot入门 03世界构建1.0版

在game场景&#xff0c;删除StaticBody2D节点&#xff0c;添加TileMap节点 添加TileSet图块集 添加TileSet源 拖动图片到图块&#xff0c;自动创建图块 使用橡皮擦擦除。取消橡皮擦后按住Shift创建大型图块。 进入选择模式&#xff0c;TileMap选择绘制&#xff0c;选中图块后在…

60V_20A超大电流LED照明车灯舞台灯同步降压芯片,驱动效率达99%并具有PWM极佳调光功能

简介 PC1226 是一款同步降压驱动控制芯片&#xff0c;用于驱动大功率 LED。芯片工作电压范围 7~60V&#xff0c;能够稳定输出高达数十安培的驱动电流&#xff0c;且有着极高的转换效率。 PC1226 集成了 PMOS 驱动模块&#xff0c;用于驱动高侧的 PMOS 功率 MOS&#xff0c;与…

【NPU 系列专栏 2 -- NVIDIA 的 H100 和 H200 是什么?】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NVIDIA H100 和 H200 芯片NVIDIA H100 芯片简介NVIDIA H100 主要特点NVIDIA H100 应用场景NVIDIA H100 使用举例NVIDIA H200 芯片简介NVIDIA H200 主要特点NVIDIA H200 应用场景NVIDIA H200 使用举例Summary NVIDIA H100 和 H20…

甲方怒斥!!!为什么媒体不按原稿发布?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 前几天执行了一个媒体邀约的项目&#xff0c;邀约媒体参会&#xff0c;以及活动现场一切都很顺利&#xff0c;稿件同步的很晚&#xff0c;但还是让几个媒体连夜进行了刊登报道&#xff0…