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

news2024/9/24 17:13:34

目录

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中元素覆盖为e
	return 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中元素覆盖为e
	return 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://www.coloradmin.cn/o/1950041.html

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

相关文章

算法 —— 暴力枚举

目录 循环枚举 P2241 统计方形&#xff08;数据加强版&#xff09; P2089 烤鸡 P1618 三连击&#xff08;升级版&#xff09; 子集枚举 P1036 [NOIP2002 普及组] 选数 P1157 组合的输出 排列枚举 P1706 全排列问题 P1088 [NOIP2004 普及组] 火星人 循环枚举 顾名思…

C语言进阶——一文带你深入了解“C语言关键字”(中篇)

本篇文章属于C语言进阶篇的“C语言关键字”&#xff0c;旨在分享我对C语言关键字的深度学习和了解。同时带领大家深入浅出的走进C语言进阶知识——关键字篇&#xff01; 目录 一、变量的命名规则 二、标识符的命名规则 一、变量的命名规则 1、命名应当直观且可以拼读&#x…

Linux网络:传输层协议TCP(一)

目录 一、TCP协议的定义 二、确认应答机制ACK 三、序号、确认序号 四、超时重传机制 一、TCP协议的定义 TCP 全称为 "传输控制协议(Transmission Control Protocol"). 人如其名, 要对数据的传 输进行一个详细的控制; TCP 协议段格式 • 源/目的端口号: 表示数据…

基于微信小程序+SpringBoot+Vue的美食推荐平台(带1w+文档)

基于微信小程序SpringBootVue的美食推荐平台(带1w文档) 基于微信小程序SpringBootVue的流浪动物救助(带1w文档) 当微信小程序占领了多半江山&#xff0c;目前不分年龄和种族&#xff0c;使用频率最高&#xff0c;覆盖面积最广。使用人群使用的大多数都是微信小程序。目前国内最…

刷题计划 day5 哈希表上

⚡刷题计划day5继续&#xff0c;可以点个免费的赞哦~ 今天开启哈希表刷题专题&#xff0c;往期可看专栏&#xff0c;关注不迷路&#xff0c; 您的支持是我的最大动力&#x1f339;~ 目录 ⚡刷题计划day5继续&#xff0c;可以点个免费的赞哦~ 今天开启哈希表刷题专题&#x…

多节点网络流量对比分析在业务性能分析中的应用

在现代企业网络环境中&#xff0c;网络流量分析已成为确保业务连续性和优化性能的关键工具。特别是多节点网络流量对比分析&#xff0c;通过对比不同节点间的流量&#xff0c;能有效发现潜在问题&#xff0c;提高网络运维效率。本文将探讨多节点网络流量对比分析在业务性能分析…

初识C++ · AVL树(1)

目录 前言&#xff1a; 1 AVL树的创建 2 部分成员函数 2.1 查找 2.2 中序遍历 2.3 插入 2.4 左旋转 2.5右旋转 前言&#xff1a; 上文&#xff0c;上上文提到了map set&#xff0c;二叉搜索树&#xff0c;其实都是为了近两文做铺垫的&#xff0c;虽然map的底层是红黑树…

Android statsd 埋点简析

源码基于&#xff1a;Android U 0. 前言 最近在研究 Android 自带的系统数据指标采集功能&#xff0c;框架依旧很严谨、完美&#xff0c;这里做个分享。 1. Android S 之后变化 stats 的代码从 framework 或 system/core 中转移到了 packages/modules/StatsD 目录中。 2. 框架…

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

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

Vue3 + Vite 打包引入图片错误

1. 具体报错 报错信息 报错代码 2. 解决方法 改为import引入&#xff0c;注意src最好引用为符引入&#xff0c;不然docker部署的时候可能也会显示不了 <template><img :src"loginBg" alt""> </template><script langts setup> …

ili9341数据手册中的常用命令

一.设置液晶显示窗口 根据液晶屏的要求&#xff0c;在发送显示数据前&#xff0c;需要先设置显示窗口确定后面发送的像素数据的显示区域。下面的0x2A和0x2B分别对应的是y轴与x轴的命令。 /********** ILI934 命令 ********************************/ #define CMD_SetCoor…

keil调试SH79F7416

仿真器JET51A, 调试设置 选择器件 再次点击调试就一切正常啦

使用moco 完成挡板测试

这里写自定义目录标题 背景使用 moco 工具完成mock挡板功能1. 下载jar包2. 简单启动2.1 准备一个简单的json文件2.2 启动 高级运用同一接口的不同返回字段部分匹配 SONPath参数结构匹配 SON Struct JSON分模块 背景 mock测试&#xff08;挡板测试&#xff09;就是在测试过程中…

在jmeter中使用javascript脚本

工作上遇到一个压力测试的需求&#xff0c;需要测试几个考试相关的接口。其中有一个获取试题详情的接口&#xff0c;和一个提交答题信息的接口。后一个接口以上一接口的返回内容为参数&#xff0c;添加上用户的答案即可。jmeter提供了非常多的方式可以实现该需求&#xff0c;这…

保障企业数据主权:安全可控的爬虫工具与管理平台

摘要 在数据驱动的时代&#xff0c;企业对数据的需求日益增长&#xff0c;但如何在保障数据主权的前提下高效采集数据&#xff1f;本文深入探讨了选择安全可控爬虫工具与管理平台的重要性&#xff0c;分析了关键特性&#xff0c;并提出实用建议&#xff0c;助力企业维护数据安…

AWT200-HPLC-M载波通讯模块/智能网关

安科瑞AWT200-HPLC-M载波通讯模块适用于对数据实时性要求不高的系统&#xff0c;数据刷新速度大于1分钟&#xff0c;比如Acrel-5000能耗管理系统 电力线载波通讯模块AWT200-HPLC-M具备载波接收和网关通讯功能&#xff0c;支持三相载波数据采集&#xff0c;协议转换和数据上传平…

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

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

windows USB 设备驱动开发- WinUSB 简介

WinUSB 是 Windows 随附的 USB 设备的通用驱动程序。WinUSB 包括&#xff1a; 内核模式驱动程序 (Winusb.sys)&#xff1b;公开 winusb.h 中所述的 WinUSB 函数的用户模式动态链接库 (Winusb.dll)。 借助这些函数&#xff0c;你可以使用用户模式软件管理 USB 设备&#xff1b;…

软件测试产教融合高质量发展论坛举办,开源网安受邀解读国家标准

近年来&#xff0c;在国家政策引导下&#xff0c;横跨教育体系内外的产教融合改革正在进行&#xff0c;推动了教育与产业深度融合、学校与企业协同发展。在软件安全领域&#xff0c;开源网安也一直走在产教融合发展的最前线&#xff0c;与各大高校建立了深度合作&#xff0c;双…

Cuppa CMS v1.0 任意文件读取漏洞(CVE-2022-25578)

前言 春秋云镜靶场是一个专注于网络安全培训和实战演练的平台&#xff0c;旨在通过模拟真实的网络环境和攻击场景&#xff0c;提升用户的网络安全防护能力和实战技能。这个平台主要提供以下功能和特点&#xff1a; 实战演练&#xff1a; 提供各种网络安全攻防演练场景&#…