详细介绍关于链表【数据结构】

news2024/11/13 12:03:07

文章目录

    • 链表
      • 单链表
        • 尾插
        • 头插
        • 尾删
          • 第一种方式删除
          • 第二种
        • 头删
        • 查找
        • pos之前插入
        • pos位置删除
        • pos后面插入
        • pos位置后面删除

链表

顺序表缺点:

  • 空间不够了 需要扩容,但是扩容是有消耗的
  • 头部或中间位置需要插入或删除,需要挪动 ,但是挪动是有消耗的
  • 避免频繁扩容 ,一次一般都是去按倍数去扩2倍,可能存在一定的空间浪费
    我们采用链表解决问题

顺序表优点:

  • 支持随机访问

链表优点:

  • 按照需求申请空间,不用了就释放空间,更加合理的运用空间
  • 头部中间插入或删除数据 ,不需要挪动数据,不存在空间浪费

缺点:

  • 每插入一个数据,都需要存一个指针去链接后面的数据节点 ,
  • 不支持随机访问,用下标直接访问第i个( arr[ i ] )

单链表

typedef struct  SListNode  // 单链表
{
	 
	SLDataType data;
	struct  SListNode* next;
}SLTNode; //单链表类型
void SListPrint(SLTNode* phead)
{
	SLTNode* cur= phead;
	while (cur != NULL)
	{
		printf("%d->", cur->data);
		cur = cur->next;
	}
}

在这里插入图片描述

尾插

尾插的本质是原来的尾节点需要存储新的尾节点地址

void SListPushBack(SLTNode** pphead  , SLDataType x) // 尾插
{                                                                                              
	//插入
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	newnode->data = x;
	newnode->next = NULL;
	if (*pphead == NULL) //链表中一个节点都没有,就不用去找尾
	{
		*pphead = newnode;
	}
	else
	{
		//找到尾节点
		SLTNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}

		tail->next = newnode;
	}

}

在这里插入图片描述

头插

 SLTNode *  BuySingListNode(SLDataType x)//创建节点
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	newnode->data = x;
	newnode->next = NULL;
	return newnode; 
}
void SListPushFront(SLTNode** pphead, SLDataType x) // 头插
{
	//创建节点
	SLTNode* newnode =BuySingListNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

在这里插入图片描述

尾删

第一种方式删除
void SListPopBack(SLTNode** pphead)  // 尾删
{
	
	assert(*pphead != NULL);  //头指针是否为空

	//只有一个节点
	if ( (*pphead)->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	//两个或两个以上的节点
	else
	{
		SLTNode* p = NULL;
		//找尾节点
		SLTNode* tail = *pphead;
		while (tail->next != NULL)
		{
			p = tail;//p指针记录倒数第二个节点 ,并且将节点置空
			tail = tail->next;
		}
		free(tail);//删除
		tail = NULL;
		p->next = NULL;
	}

}

在这里插入图片描述

第二种
void SListPopBack(SLTNode** pphead)  // 尾删
{
	
	assert(*pphead != NULL);  //头指针是否为空

	//只有一个节点
	if ( (*pphead)->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	
	else  //不创建临时变量p的方式去尾删
	{
		//找尾节点
		SLTNode* tail = *pphead;
		while (tail->next->next)
		{
			tail = tail->next;
		}
		 //删除
		free(tail->next);
		tail->next = NULL;
	}

}

在这里插入图片描述

头删

void SingleListPopFront(SLTNode** pphead)
{
	assert(*pphead);
	SLTNode* first = *pphead;
	*pphead = first->next;
 	free(first);
	first = NULL;

}

在这里插入图片描述

查找

int  SingleListFind(SLTNode* phead, SingleListDataType x)
{

	SLTNode* cur = phead;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}

		cur = cur->next;
	}

	return NULL;

}

pos之前插入

void SingleListInsert(SLTNode** pphead, SLTNode* pos, SingleListDataType x)
{
	assert(pos);
	assert(pphead);
	 //只有一个节点相当于头插
	if (*pphead ==pos)
	{
		SingleListPushFront(pphead ,x);
	}
	else//多个节点
	{
		//找到pos的前一个位置
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		SLTNode* newnode = BuySingListNode(x);
	
		prev->next = newnode;
		newnode->next = pos;
	}
}

在这里插入图片描述

pos位置删除

void SingleListErase(SLTNode** pphead, SLTNode* pos)
{
		assert(pphead);
		assert(pos);
	 //只有一个节点相当于头删
	if (*pphead==pos)
	{
		SingleListPopFront(pphead);
	}

	// 多个节点
	else
	{
		//找到pos的前一个位置
		SLTNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}
		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}

}

在这里插入图片描述

pos后面插入

void SingleListInsertAfter(SLTNode* pos, SingleListDataType x)  //pos后面插入
{
	assert(pos);
	SLTNode* newnode = BuySingListNode(x);
	newnode->next = pos->next;
	pos->next = newnode;
}

在这里插入图片描述

pos位置后面删除

void SingleListEraseAfter(SLTNode* pos)   // 从pos后面删除
{
	assert(pos);
	assert(pos->next);

	SLTNode* del = pos->next;
	pos->next = del->next;
	free(del);
	del = NULL;
}

在这里插入图片描述

如果你觉得这篇文章对你有帮助,不妨动动手指给点赞收藏加转发,给鄃鳕一个大大的关注
你们的每一次支持都将转化为我前进的动力!!!

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

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

相关文章

如何让AI帮你干活-娱乐(3)

背景今天的话题会偏代码技巧一些,对于以前没有接触过代码的朋友或者接触代码开发经验较少的朋友会有些吃力。上篇文章介绍了如何广视角的生成相对稳定的视频。昨天的实现相对简单,主要用的是UI界面来做生成。但是生成的效果其实也显而易见,不…

汽车娱乐系统解决方案

Danlaw在汽车和航空航天行业里是全球知名的技术和服务供应商,致力于提供更加安全与智能的系统。Danlaw以突破性技术和高效开发、动态环境的自适应解决方案而闻名。Danlaw优秀的联网汽车解决方案使之成为全球大型互联设备供应商之一。 一 信息娱乐系统测试 | 风丘科…

力扣-查找每个员工花费的总时间

大家好,我是空空star,本篇带大家了解一道简单的力扣sql练习题。 文章目录前言一、题目:1741. 查找每个员工花费的总时间二、解题1.正确示范①提交SQL运行结果2.正确示范②提交SQL运行结果3.正确示范③提交SQL运行结果4.正确示范④提交SQL运行…

妙算(manifold-2G)通过网线连接笔记本实现静态ip上网

本质就是共享笔记本wifi,配置以太网静态ip,然后在工控机上连接 参考: https://zhuanlan.zhihu.com/p/378814739 https://blog.csdn.net/weixin_42128941/article/details/98635554 设备 笔记本电脑win10妙算ubuntu16.04网线 首先&#xff0…

RTOS中的消息队列的原理以及应用

消息队列的原理 RTOS中的消息队列是一种用于任务间通信的机制,它可以实现任务之间的异步通信,从而实现任务间的解耦。消息队列是一个先进先出的数据结构,任务可以向队列中发送消息,也可以从队列中接收消息。 消息队列的原理如下…

ChatGPT技术与商业模式及产业发展布局方案

文章目录模块一:概念模块二:架构模块三:技术模块四:算力模块五:体验模块六:应用模块七:商业模块八:产业模块九:建议结语主要内容: 采用模块化教学方法&#x…

【数据结构】二叉树与堆

文章目录1.树概念及结构1.1树的相关概念1.2树的结构2.二叉树概念及结构2.1相关概念2.2特殊的二叉树2.3二叉树的性质2.4二叉树的存储结构3.二叉树的顺序结构及实现3.1二叉树的顺序结构3.2堆的概念3.3堆的实现Heap.hHeap.c3.4堆的应用3.4.1 堆排序3.4.2 TOP-KOJ题最小K个数4.二叉…

ESXI主机安装Zabbix 6.2

1:首先下载Zabbix Appliance 2:还需要下载VMware converter ,这个需要VMware的账号,或者从其他地方下载也可以。 3:vmdk格式的 image 可直接在 VMware Player、 Server 和 Workstation 产品中使用。要在 ESX,、ESXi 和 vSphere 中…

下一站,冠军|走进2022 OceanBase数据库大赛12强

欢迎访问OceanBase官网获取更多信息:https://www.oceanbase.com/ 还记得 2021 OceanBase 数据库大赛中 令人羡慕的神雕侠侣 “NoPassCET4”吗? 打比赛,也打蚊子的“两只老虎吃萝卜”吗? 一个人扛起一支队伍的 “lying_flat”吗…

小孩用的台灯什么样的品牌好?2023儿童台灯灯具品牌排行榜

现代社会高速发展,孩子小小年纪就使用上了各种电子产品,加上学习压力较大,近视问题也普遍比较严重。据统计,我国青少年儿童近视率常年维持在50%以上,半数以上的孩子都患有近视,高居世界第一,情况…

c---冒泡排序模拟qsort

一、冒泡排序 二、冒泡排序优化排各种类型数据 文章目录一、冒泡排序二、冒泡排序优化排各种类型数据冒泡排序 冒泡排序原理&#xff1a;两两相邻元素进行比较 初级版 void bulle_sort(int* a, int sz) {int i 0;for (int i 0; i < sz-1; i){int j 0; for (j 0; j…

阿里大佬翻遍全网Java面试文章,总结出这份1658页文档,GitHub收获25K+点赞

就目前大环境来看&#xff0c;跳槽成功的难度比往年高很多。一个明显的感受&#xff1a;今年的面试&#xff0c;无论一面还是二面&#xff0c;都很考验Java程序员的技术功底。这不又到了面试跳槽的黄金段&#xff0c;成功升职加薪&#xff0c;不成功饱受打击。当然也要注意&…

使用日历丰富产品的用户体验

前言 经过一段时间的梳理和遴选&#xff0c;我挑选出了Android知识图谱中重要的部分&#xff0c;制作了一张脑图。读者朋友们可按照脑图查漏补缺了&#xff0c; 图片尺寸较大&#xff0c;仅附链接 。 当然&#xff0c;这是我按照自己的判断、结合参考其他博主的观点进行的挑选…

sort函数对结构体|pair对组|vector容器|map排序|二维数组的第x列 的排序

目录 sort对 vector容器 sort对 vector<pair<int,int>>对组 sort对 结构体 结构体外部规定排序 结构体内部运算符重载 map容器的排序 map的键排序 map的值排序 sort对二维数组的排序 sort对 vector容器 sort()函数可以用于对vector容器进行排序。具体来…

java基础学习 day49(JDK8的接口新特性,JDK9的新特性,接口的应用场景)

JDK8以后&#xff0c;接口中新增的默认方法 允许在接口中定义默认方法&#xff0c;需要使用关键字default修饰&#xff0c;作用为&#xff0c;解决接口升级时&#xff0c;需要强制修改所有实现类的问题接口中默认方法的定义格式&#xff1a; a. 格式&#xff1a; public defau…

【黄河流域公安院校网络空间安全技能挑战赛】部分wp

文章目录webbabyPHPfunnyPHPEzphp**遍历文件目录的类**1、DirectoryIterator&#xff1a;2、FilesystemIterator:3、**Globlterator**读取文件内容的类&#xff1a;SplFileObjectMisc套娃web babyPHP <?php highlight_file(__FILE__); error_reporting(0);$num $_GET[nu…

排序模型:DIN、DINE、DSIN

目录 DIN 输入 输出&#xff1a; 与transformer注意力机制的区别与联系&#xff1a; DINE 改善DIN 输入&#xff1a; DSIN 动机&#xff1a; DIN 适用与精排&#xff0c;论文&#xff1a; Deep Interest Network for Click-Through Rate Prediction DIN模型提出的动…

蓝桥web基础知识学习

HTMLCSS 知识点重要指数HTML 基础标签&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;HTML5 新特性&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;HTML5 本地存储&#x1f31f;&#x1f31f;&#x1f31f;&#x1f31f;CSS 基础语法…

Java中方法引用(引用静态方法、引用成员方法(引用其他类的成员方法、引用本类的成员方法、引用父类的成员方法)、引用构造方法、其他调用方式、小练习)

方法引用&#xff1a;把已经存在的方法拿过来用&#xff0c;当作函数式接口中抽象方法的方法体 我们前面学到Arrays工具类中的sort方法&#xff0c;当我们需要指定排序规则时&#xff0c;需要传递Comparator接口的实现类对象&#xff0c;我们之前使用匿名内部类类的形式作为参…

下一个元宇宙热点?探讨元宇宙婚礼的未来趋势

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;7分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 专家认为&#xff0c;在不久的将来&#xff0c;传统婚礼和元宇宙婚礼有可能共存…