单链表算法实现, 查找, 删除, 销毁

2023-10-27

从链表的指定位置读取参数

/**************************
* 从链表中查找第i个元素
* 用e来保存查找元素的数据
* 指定位置读取参数:
*		list: 头节点
*		i: 要读取的位置
*		e: 保存读取的元素
***************************/
bool Link_GetElem(LinkList *&list, int i, int &e) {
	if (!list) return false;	// 传递空值
	int  index = 0;				// 用来记录节点数量
	LinkList *p;				// 临时指针
	p = list->next;				// p指向第一个节点
	index = 1;
	while (p && index < i) {	// p不是空的, 而且当前节点数量小于i
		p = p->next;
		index++;
	}
	if (!p || index > i) return false;	// 访问越界, i>index 或者 i<=0;
	e = p->data;				// 把找到的第i个元素的data赋值给e
	return true;
}

从链表里存储的数据查找读取参数

/**************************
* 按值查找读取参数:
*		list: 头节点
*		e: 要查找数据的值
*		index: 值所在位置
***************************/
bool Link_FindElem(LinkList *&list, int e, int &index) {
	if (!list) { 
		index = 0;
		return false; 
	}
	LinkList *p;
	p = list->next;
	index = 1;
	while (p && p->data != e) {	//p不为空, 而且p的data不等于e
		p = p->next;
		index++;
	}
	if (!p) {		//查找结果不存在
		index = 0;	
		return false; 
	}	
	return true;
}

从链表删除单链表的参数

/**************************
* 删除单链表的参数:
*		list: 头节点
*		i: 要删除的数据
***************************/
bool Link_Delete(LinkList *&list, int i) {
	if (!list) return false;
	int index = 0;
	LinkList *p;	// 临时变量
	LinkList *q;	// 指向要删除的元素
	p = list;
	while (p->next && index < i - 1) {	
		p = p->next;
		index++;
	}
	if (!p->next || index > i - 1) return false;	// 当i>index 或者 i<1, 删除失败
	q = p->next;		// q指向要删除的节点
	p->next = q->next;	// p的下一个节点指向要删除的下一个节点
	delete q;			// 删除q
	return true;
}

单链表销毁

//单链表的销毁
void Link_Destroy(LinkList *&list) {
	LinkList *p = list;
	cout << "销毁链表" << endl;
	while (p) {
		list = list->next;	//指向下一个节点
		cout << "删除元素:" << p->data << endl;
		delete p;			//删除节点
		p = list;
	}
}

完整代码实现

#include <iostream>
#include <Windows.h>

using namespace std;

//定义一个链表
typedef struct LinkNode {
	int data;			//链表节点的数据域
	LinkNode *next;		//链表节点的指针域
} LinkNode,		//链表节点的指针域
LinkList;		//链表头节点, 指向LinkNode节点

bool listInit(LinkList *&list) {
	list = new LinkNode;	//分配内存
	if (!list) return false;	//生成节点失败
	list->next = NULL;	//头节点设置为空
	return true;
}

/**************************
* 头插法参数:
*		list: 头节点
*		node: 要插入的元素
***************************/
bool listAdd_Front(LinkList *&list, LinkNode *node) {
	if (!list || !node) { return false; }	//传递空值
	node->next = list->next;	//把头节点指向旧的1号节点, 赋值给新的1号节点
	list->next = node;			//头节点指向新的1号节点
	return true;
}

//输出链表的元素
void listPrint(LinkList *&list) {
	if (!list) return;		//传递空值
	LinkNode *node;			//临时变量
	cout << "链表的输出" << endl;
	node = list->next;		//节点赋值给临时变量(不包括头节点)
	while (node) {
		cout << node->data << "\t";
		node = node->next;
	}
}

/**************************
* 从链表中查找第i个元素
* 用e来保存查找元素的数据
* 指定位置读取参数:
*		list: 头节点
*		i: 要读取的位置
*		e: 保存读取的元素
***************************/
bool Link_GetElem(LinkList *&list, int i, int &e) {
	if (!list) return false;	// 传递空值
	int  index = 0;				// 用来记录节点数量
	LinkList *p;				// 临时指针
	p = list->next;				// p指向第一个节点
	index = 1;
	while (p && index < i) {	// p不是空的, 而且当前节点数量小于i
		p = p->next;
		index++;
	}
	if (!p || index > i) return false;	// 访问越界, i>index 或者 i<=0;
	e = p->data;		// 把找到的第i个元素的data赋值给e
	return true;
}

/**************************
* 按值查找读取参数:
*		list: 头节点
*		e: 要查找数据的值
*		index: 值所在位置
***************************/
bool Link_FindElem(LinkList *&list, int e, int &index) {
	if (!list) { 
		index = 0;
		return false; 
	}
	LinkList *p;
	p = list->next;
	index = 1;
	while (p && p->data != e) {	//p不为空, 而且p的data不等于e
		p = p->next;
		index++;
	}
	if (!p) {		//查找结果不存在
		index = 0;	
		return false; 
	}	
	return true;
}

/**************************
* 删除单链表的参数:
*		list: 头节点
*		i: 要删除的数据
***************************/
bool Link_Delete(LinkList *&list, int i) {
	if (!list) return false;
	int index = 0;
	LinkList *p;	// 临时变量
	LinkList *q;	// 指向要删除的元素
	p = list;
	while (p->next && index < i - 1) {	
		p = p->next;
		index++;
	}
	if (!p->next || index > i - 1) return false;	// 当i>index 或者 i<1, 删除失败
	q = p->next;		// q指向要删除的节点
	p->next = q->next;	// p的下一个节点指向要删除的下一个节点
	delete q;			// 删除q
	return true;
}

//单链表的销毁
void Link_Destroy(LinkList *&list) {
	LinkList *p = list;
	cout << "销毁链表" << endl;
	while (p) {
		list = list->next;	//指向下一个节点
		cout << "删除元素:" << p->data << endl;
		delete p;			//删除节点
		p = list;
	}
}

int main(void) {
	LinkList *list = NULL;		//头节点
	LinkNode *node = NULL;		//新节点
	// 1.初始化空的链表
	listInit(list);
	// 2.前插法插入元素
	int n;
	cout << "前插法创建单链表" << endl;
	cout << "请输入个数: ";
	cin >> n;
	while (n > 0) {
		node = new LinkNode;	//生成新节点
		if (!node) return false;
		for (int i = 0; i < n; i++) {
			node->data = i + 1 * 10;
		}
		listAdd_Front(list, node);
		n--;
	}

	// 3.单链表输出
	listPrint(list);

	 4.单链表获取指定位置的值
	//int index = 0;
	//int m = 0;
	//cout << endl << "请输入要获取的元素的位置: ";
	//cin >> m;
	//if (Link_GetElem(list, m, index)) {
	//	cout << "获取第" << m << "个元素成功, 值:" << index << endl;
	//} else {
	//	cout << "获取第" << m << "个元素失败!" << endl;
	//}

	 5.单链表获取指定的值
	//int index = 0;
	//int m = 0;
	//cout << endl << "请输入元素的值: ";
	//cin >> m;
	//if (Link_FindElem(list, m, index)) {
	//	cout << "获取值: " << m << "成功, 位置:" << index << endl;
	//} else {
	//	cout << "获取" << m << "值失败, 位置:" << index << endl;
	//}

	//int m = 0;
	//cout << endl << "请输入要删除元素的位置: ";
	//cin >> m;
	//if (Link_Delete(list, m)) {
	//	cout << "删除第" << m << "个元素成功!" << endl;
	//} else {
	//	cout << "删除第" << m << "个元素失败!" << endl;
	//}
	//listPrint(list);

	//销毁整个链表
	Link_Destroy(list);
	
	system("pause");
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单链表算法实现, 查找, 删除, 销毁 的相关文章

  • 算法题:完全二叉树的权值

    问题描述 给定一棵包含 N 个节点的完全二叉树 树上每个节点都有一个权值 按从 上到下 从左到右的顺序依次是 A1 A2 AN 如下图所示 现在要把相同深度的节点的权值加在一起 他想知道哪个深度的节点 权值之和最大 如果有多个深度的权值和同
  • 代理模式,以及Java的动态代理

    定义 为其他对象提供一种代理以控制对这个对象的访问 可以提供额外不同的操作 UML类图 Subject类 定义了RealSubject和Proxy的共用接口 这样就在任何使用RealSubject的地方都可以使用Proxy RealSubj
  • UNIX环境高级编程 学习笔记 第十八章 终端I/O

    20世纪70年代后期 系统 UNIX System III 发展出一套不同于V7 Version 7 Unix 的终端IO例程 使得UNIX终端IO处理分立为两种不同风格 一种是系统 风格 它延续到了System V 另一种是V7风格 它成

随机推荐

  • 暴力破解Windows、Linux登录密码

    Windows密码破解 使用hydra离线破解windows密码 使用getpass内存提取windows用户密码 使用quarkpwdump导出windows用户密码hash值 Linux密码破解 使用hydra离线破解linux密码 将
  • idea启动java项目卡住问题

    当遇到 Method breakpoints may dramatically slow down debugging时 这时有可能可以进行下面步骤解决 Ctrl Shift F8 打开Breakpoints面板 然后可以测试是否可行
  • 记录好项目D21

    记录好项目 你好呀 这里是我专门记录一下从某些地方收集起来的项目 对项目修改 进行添砖加瓦 变成自己的闪亮项目 修修补补也可以成为毕设哦 本次的项目是个基于Springboot的教务管理系统 学生管理系统 课表查询系统 一 系统介绍 本项目
  • 使用EventEmitter构建基础的生命周期模型

    使用EventEmitter构建基础的生命周期模型 比如onCreate onUpdate onDestroy 分别在每个阶段console log一条消息 比如说 我们构建一个便签管理的EventEmitter 在onCreate时初始化
  • 献给面试学生 关键字const是什么意思 ESP(译者:Embedded Systems Programming) --Dan Saks概括了const的所有用法

    关键字const是什么含意 答 我只要一听到被面试者说 const意味着常数 我就知道我正在和一个业余者打交道 去年Dan Saks已经在他的文章里完全概括了const的所有用法 因此ESP 译者 Embedded Systems Prog
  • 商品期货的模拟盘能打印交易记录吗(商品期货的模拟盘能打印交易记录吗为什么)

    商品期货模拟盘可以打印交易记录吗 仿真盘没有实际测试过 大家可以自己试试 股指期货模拟交易和股指期货模拟交易有什么区别 您好 开展模拟交易的目的是为了深化对股指期货合约 规则和制度的检验 开展投资者教育活动 在模拟的交易过程中 交易过程 结
  • 【4-3】多彩的声音

    设计和实现一 个Soundable发声接口 该接口具有发声功能 同时还能调节声音大小 Soundable接口的这些功能将由有3种声音设备来实现 他们分别是收音机Radio 随身听Walkman 手机MobilePhone 最后还需设计 个应
  • mac查看电脑ip(在终端输入命令)

    在终端输入命令 ipconfig getifaddr en0
  • 科普:你该认识的四种常见开源许可证

    为什么80 的码农都做不了架构师 gt gt gt 开源早已成为很多科技企业关注的焦点 我们也常会发现部分开源技术后面标注了某种协议 这意味着这些开源代码被框上了某种束缚 或者说这些代码将必须遵循这些规则 否则可能会触及法律 总的来看 如今
  • 【因果推断与机器学习】Causal Inference: Chapter_3

    Identification Introduction 在介绍这节的补充内容呢 我想先引进一个著名的 辛普森悖论 辛普森医生发现了一种新药 这种新药可以降低心脏病发作的风险 于是他开始查找历史的实验数据 他注意到 如果男性患者服用了这种药
  • P1102 A-B 数对

    include
  • 图解python吴灿铭网盘_正版 图解算法 使用Python 吴灿铭 数据结构程序调试方法技巧书数组堆栈链表队列算法书Pytho...

    第1章进入算法的世界1 1 1生活中到处都是算法2 1 1 1算法的定义3 1 1 2算法的条件4 1 1 3时间复杂度O f n 6 1 2常见算法简介7 1 2 1分治法8 1 2 2递归法9 第1章进入算法的世界1 1 1生活中到处都
  • vue后台管理系统(通用模板)

    后台管理通用框架 源码 GitHub 亲测有效 预览地址 目前 包含 动态侧边导航栏渲染 面包屑 通知 主题 富文本等 1 登陆 2 工作台 3 通知 4 主题 5 发邮件 6 通知详情 目前可实现Excel表格下载 请见MarkDown文
  • HoloLens MRTK2.7 Unity2020 URP

    先提供工程下载链接 链接 https pan baidu com s 11LUGRzaTBxWOjUFwjZBKLQ 提取码 8xy6 优点 XR Plugin已经融合了MR AR VR 工程不用修改可以打包不同平台 可以使用ShaderG
  • arm linux ntfs_Linux驱动02

    一 启动过程 上电 gt uboot gt 加载linux内核 gt 挂载根文件系统 gt 执行应用程序 emmm 接下来会对uboot linux内核 跟文件系统分析 二 uboot 1 什么是uboot uboot其实就是一个通用的引导
  • Python打开图像始终提示错误error:(-215) size.width>0 && size.height>0

    用Python打开图像始终提示错误 cv2 error C projects opencv python opencv modules highgui src window cpp 331 error 215 size width gt 0
  • 深度学习之CNN卷积神经网络

    详解卷积神经网络 CNN 卷积神经网络 Convolutional Neural Network CNN 是一种前馈神经网络 它的人工神经元可以响应一部分覆盖范围内的周围单元 对于大型图像处理有出色表现 概揽 卷积神经网络 Convolut
  • DNS over HTTPS来阻止DNS污染

    DNS 域名系统 的主要功能是将域名解析成IP地址 域名的解析工作由DNS服务器完成 从安全角度来看 域名解析的请求传输时通常不进行任何加密 这导致第三方能够很容易拦截用户的DNS 将用户的请求跳转到另一个地址 常见的攻击方法有DNS劫持和
  • 9.多重循环结构和程序调试

    2022 9 3 记录学习java的第九天 今天主要学习了多种循环的嵌套使用和程序调试 1 多重循环 使用方法 1 相同循环可以互相嵌套使用 2 各循环之间可以互相嵌套使用 3 外循环变量改变一次 内循环变量要从头到尾变化一遍 即 内循环是
  • 单链表算法实现, 查找, 删除, 销毁

    从链表的指定位置读取参数 从链表中查找第i个元素 用e来保存查找元素的数据 指定位置读取参数 list 头节点 i 要读取的位置 e 保存读取的元素 bool Link GetElem LinkList list int i int e i