单链表的基本操作实现:初始化、尾插法、头插法、输出单链表、求表长、按序号查找、按值查找、插入结点、删除结点。

1.参考学习博文(写的相当好的文章):

http://t.csdnimg.cn/AipNl

2.关于我的总结:

定义单链表:

typedef struct LNode
{
	Elemtype data;
	struct LNode* next;
}LNode;

data用来存放元素值,next用来指向后继结点,

typedef是自定义结构体,单链表的结点类型为LNode

typedef struct LNode{//单链表的结构定义
    int data;//定义int类型的数据域
    struct LNode *next; //定义指针域
}LNode,*linklist;

这个地方会出现两个让人比较迷的东西:结构指针LNode和linklist。本质上而言,这两种类型是等价的。通常用linklist说明指针变量,强调它是某个单链表的头指针变量,定义为linklist L,L表示头指针。LNode用来定义单链表中结点的指针,例如LNode *p,p为结点的指针变量,p也可以定义为头结点。但是在方法的编写时,这两种定义会混合使用,非常容易迷惑我们的思维。我都只使用LNode来定义。

                                                                                                出处:http://t.csdnimg.cn/AipNl

 3.关于我的疑问:

按序号查找元素时,元素的值,用e返回,为什么e要用引用型变量&e

int Getelem_L(LNode* L, int i, int &e)

4.实战代码:

#define _CRT_SECURE_NO_WARNINGS
typedef int Elemtype;
#define ERROR -1
#include<stdio.h>
#include <iostream>
using namespace std;

//定义结构体储存俩个元素:data存放元素值,next指向后继节点。
typedef struct LNode
{
	Elemtype data;
	struct LNode* next;
}LNode;

//初始化单链表
void InitList(LNode* & L)
{
	L = new LNode;
	L->next = NULL;
}

//建立单链表
//头插法
//void CreateList_H(LNode*& L, int n)
//{
//	LNode* p;
//	for (int i = n; i > 0; --i)
//	{
//		p = new LNode;
//		cin >> p->data;
//		p->next = L->next;
//		L->next = p;
//	}
//}

//尾插法
void CreateList_R(LNode*& L, int n)
{
	LNode* r = L,*p;
	for (int i = 0; i < n; ++i)
	{
		p = new LNode;
		cin >> p->data;
		p->next = NULL;
		r->next = p;
		r = p;
	}
}

//输出单链表
void DispList(LNode* L)
{
	LNode* p = L->next;
	printf("打印单链表:\n");
	while (p != NULL)
	{
		printf("%d ", p->data);
		p = p->next;
	}
	printf("\n");
}

//求单链表的长度
int ListLength_L(LNode* L)
{
	int  i = 0;
	LNode* p;
	p = L->next;
	while (p) {
		i++;
		p = p->next;
	}
	return i;
}


//按序号查找单链表中的元素(从p=L->next依次扫描,j=1,p每次移动j加1,当j==i时,则找到)
int Getelem_L(LNode* L, int i, int &e)
{
	LNode *p = L->next;
	int j = 1;
	while (p && j < i)
	{
		p = p->next;
		++j;
	}
	if (!p || j > i)
		return ERROR;
	e = p->data;
	return e;
}

//按值查找(从第一个结点依次和e比较,找到返回位置或地址,未找到则返回0或NULL)
int LocateLem_L(LNode* L, int e)
{
	int i = 1;
	LNode* p = L->next;
	while (p && p->data != e)
	{
		p = p->next;
		i++;
	}
	if (p == NULL)
		return(0);
	else
	    return i;
}

//单链表的插入操作(在L中第i个元素之前插入e)
void ListInsert_L(LNode*& L, int i, int e)
{
	LNode* p = L;
	LNode* s;
	int j = 0;
	while (p && j < i - 1)  //查找到第i-1个元素
	{
		p = p->next;
		++j;
	}
	s = new LNode;   //创建新结点s,将data域置为e
	s->data = e;
	s->next = p->next;//将新结点插入结点p之后
	p->next = s;
}

//单链表的删除操作(找到p指向的a(i-1),保存ai,令p->next指向a(i+1),p->next=p->next->next,最后释放结点ai的空间)
void ListDelete_L(LNode*& L, int i, int& e)
{
	LNode* p = L;
	LNode* q;          //创建一个新结点q用来临时保存被删除的元素
	int j = 0;
	while (p->next && j < i - 1)  //查到第i-1个元素,p指向第i-1个元素
	{
		p = p->next;
		++j;
	}
	if (!(p->next) || j > i - 1)  //如果查不到第i-1个元素或者查的元素超过范围,则不进行接下来的操作
		return;
	q = p->next;      //q指向第i个元素
	p->next = q->next;   //p指向第i+1个元素
	e = q->data;      //e保存结点q的元素
	delete q;  //释放q的空间
	printf("删除的元素是:%d", e);
}


int main()
{
	LNode* L;
	//初始化单链表
	InitList(L);
	//尾插法
	printf("please input five numbers\n");
	CreateList_R(L, 5);
	printf("-----------------------------------\n");
	//输出单链表
	DispList(L);
	printf("-----------------------------------\n");
	//求表长
	printf("单链表的长度为:%d\n", ListLength_L(L));
	printf("-----------------------------------\n");
	//按序号查找单链表中的元素
	printf("你要查找的元素序列是:");
	int i,e;
	cin >> i;
	printf("\n");
	printf("要查找的元素是:%d\n",Getelem_L(L, i, e));
	printf("-----------------------------------\n");
	//按值查找
	printf("请输入要查找的值:");
	cin >> e;
	printf("\n");
	printf("该元素的位置是:%d\n", LocateLem_L(L, e));
	printf("-----------------------------------\n");
	//插入结点
	int a=0 , b=0;
	printf("请输入要插入的位置:");
	cin >> a;
	printf("请输入要插入元素的值:");
	cin >> b;
	ListInsert_L(L, a, b);
	printf("\n");
	DispList(L);//输出单链表
	printf("-----------------------------------\n");
	//删除元素
	printf("请输入要删除的元素位置:\n");
	int c = 0,d=0;
	cin >> c;
	ListDelete_L(L, c,d);
	printf("\n");
	DispList(L);//输出单链表
	printf("-----------------------------------\n");
return 0;
}

5.实战效果演示(已跑代码,准确运行)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

go语言是如何实现协程的

写在文章开头 go语言的精华就在于协程的设计&#xff0c;只有理解协程的设计思想和工作机制&#xff0c;才能确保我们能够完全的利用协程编写强大的并发程序。 Hi&#xff0c;我是 sharkChili &#xff0c;是个不断在硬核技术上作死的 java coder &#xff0c;是 CSDN的博客专…

【云计算】云计算八股与云开发核心技术(虚拟化、分布式、容器化)

【云计算】云计算八股与云开发核心技术&#xff08;虚拟化、分布式、容器化&#xff09; 文章目录 一、什么是云计算&#xff1f;1、云计算的架构&#xff08;基础设施&#xff0c;平台&#xff0c;软件&#xff09;2、云计算的发展 二、如何做云计算开发&#xff1f;云计算的核…

IBM SPSS Statistics for Mac:数据分析的卓越工具

IBM SPSS Statistics for Mac是一款功能强大的数据分析软件&#xff0c;专为Mac用户设计&#xff0c;提供了一系列专业的统计分析和数据管理功能。无论是科研人员、数据分析师还是学生&#xff0c;都能从中获得高效、准确的数据分析支持。 IBM SPSS Statistics for Mac v27.0.1…

管道流设计模式结合业务

文章目录 流程图代码实现pomcontextEventContextBizTypeAbstractEventContext filterEventFilterAbstractEventFilterEventFilterChainFilterChainPipelineDefaultEventFilterChain selectorFilterSelectorDefaultFilterSelector 调用代码PipelineApplicationcontrollerentitys…

在C#中,PDFsharp库使用(三):PDF提取

PDF提取 一、PDF提取功能&#xff0c;看图 二、PDF提取界面 三、PDF提取代码 //pdf提取---选择文件Button private void button9_Click(object sender, EventArgs e) {string oneFilePath GetOneFilepath();if (!string.IsNullOrEmpty(oneFilePath)){textBox3.Text oneFilePa…

springboot汽车企业公司网站的系统设计ssm-java

框架&#xff1a;SSM/springboot都有 jdk版本&#xff1a;1.8 及以上 ide工具&#xff1a;IDEA 或者eclipse 数据库: mysql 编程语言: java 前端&#xff1a;layuibootstrapjsp 详细技术&#xff1a;HTMLCSSJSjspspringmvcmybatisMYSQLMAVENtomcat 开发工具 IntelliJ IDEA: 一…

带小数点的String类型数据,如何只取整数?

一、场景引入 如果前端页面存在列表展示用户数据&#xff0c;但是用户数据存在非常多的小数位&#xff0c;从页面来看&#xff0c;数据太多就会不太美观&#xff0c;因此&#xff0c;出于场景美化考虑&#xff0c;在不影响业务功能的情况下&#xff0c;可以只展示整数内容&…

00_Linux

文章目录 LinuxLinux操作系统的组成Linux的文件系统Linux操作系统中的文件类型Linux操作系统的组织结构 Linux vs WindowsNAT vs 桥接模式 vs 仅主机Linux Shell命令Linux⽂件与⽬录管理相关指令目录文件普通文件文本编辑 用户管理添加用户删除用户用户组管理 文件权限管理权限…

家庭营销广告Criteo公司首次获得MRC零售媒体测量认证

家庭营销广告Criteo公司首次获得零售媒体测量MRC认证 商业媒体公司Criteo2024年3月28日宣布&#xff0c;它首次获得媒体评级委员会&#xff08;MRC&#xff09;的认证&#xff0c;在其企业零售媒体平台commerce Max和commerce Yield上&#xff0c;在桌面、移动网络和移动应用内…

PCL SAC_IA配准高阶用法——统计每次迭代的配准误差并可视化

目录 一、概述二、代码实现三、可视化代码四、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 在进行论文写作时,需要做对比实验,来分析改进算法的性能,期间用到了迭代误差分布统计的比较分析,为直…

mid_360建图和定位

录制数据 roslaunch livox_ros_driver2 msg_MID360.launch使用fast-lio 建图 https://github.com/hku-mars/FAST_LIO.git 建图效果 使用python做显示 https://gitee.com/linjiey11/mid360/blob/master/show_pcd.py 使用 point_lio建图 https://github.com/hku-mars/Point…

如何在C++的STL中巧妙运用std::find实现高效查找

如何在C的STL中巧妙运用std::find实现高效查找 一、简介二、在那里吗&#xff1f;2.1、在未排序的元素上2.2、已排序元素 三、在哪里?3.1、在未排序的元素上3.2、已排序元素 四、应该在哪里?五、结论 一、简介 本文章旨在涵盖所有在STL中&#xff08;甚至稍微超出&#xff0…

Eclipse 配置JDK版本,Eclipse Maven install 时使用的JDK版本

Eclipse配置JDK版本 Eclipse 配置JDK版本的地方&#xff1f; 在Eclipse中配置JDK版本的步骤如下&#xff1a; 打开Eclipse IDE。转到菜单栏并选择 “Window”&#xff08;窗口&#xff09;选项。在下拉菜单中选择 “Preferences”&#xff08;首选项&#xff09;&#xff0c;或…

asp.net core 依赖注入后的服务生命周期

ASP.NET Core 依赖注入&#xff08;DI&#xff09;容器支持三种服务的生命周期选项&#xff0c;它们定义了服务实例的创建和销毁的时机。理解这三种生命周期对于设计健壯且高效的应用程序非常重要&#xff1a; 瞬时&#xff08;Transient&#xff09;&#xff1a; 瞬时服务每次…

大型网站系统架构演化实例_3.使用服务集群改善网站并发处理能力

1.使用服务集群改善网站并发处理能力 使用集群是网站解决高并发、海量数据问题的常用手段。当一台服务器的处理能力、存储空间不足时&#xff0c;不要企图去更换更强大的服务器&#xff0c;对大型网站而言&#xff0c;不管多么强大的服务器&#xff0c;对大型网站而言&…

算法练习第20天|回溯算法 77.组合问题 257. 二叉树的所有路径

1.什么是回溯算法&#xff1f; 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。其本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案。 2.为什么要有回溯算法? 那么既然回溯法并不高效为什么还要用它呢&#xff1f; 因为有的问题能暴力…

第10章 物理安全要求

10.1 站点与设施设计的安全原则 假如没有对物理环境的控制&#xff0c;任何管理的、技术的或逻辑的访问控制技术都无法提供足够的安全性。 如果怀有恶意的人员获取了对设施及设备的物理访问权&#xff0c;那么他们几乎可以为所欲为&#xff0c;包括肆意破坏或窃取、更改数据。…

光伏工程施工前踏勘方案与注意事项

光伏工程是指利用光能发电的技术。随着清洁能源的发展&#xff0c;光伏工程在能源领域的应用越来越广泛。在进行光伏工程施工前&#xff0c;需要对施工现场进行踏勘&#xff0c;以确保施工能够顺利进行并达到预期的效果。 本文游小编带大家一起看一下探勘的方案和注意事项。 1…

设计模式胡咧咧之策略工厂实现导入导出

策略模式&#xff08;Strategy Pattern&#xff09; 定义&#xff1a; 定义了一组算法&#xff0c;将每个算法都封装起来&#xff0c;并且使它们之间可以互换。 本质: 分离算法&#xff0c;选择实现 应用场景 何时使用 一个系统有许多类&#xff0c;而区分他们的只是他们直接…

【赛题】2024年“华中杯”数模竞赛赛题发布

2024年"华中杯"数学建模网络挑战赛——正式开赛&#xff01;&#xff01;&#xff01; 赛题已发布&#xff0c;后续无偿分享各题的解题思路、参考文献&#xff0c;帮助大家最快时间&#xff0c;选择最适合是自己的赛题。祝大家都能取得一个好成绩&#xff0c;加油&a…
最新文章