C语言数据结构-----单链表(无头单向不循环)

news2024/11/24 22:42:41

前言

本篇讲述了单链表的相关知识,以及单链表增删查改的代码实现。

文章目录

  • 前言
  • 1.链表
    • 1.1 链表的结构和概念
  • 2.(增删查改)单链表的实现
    • 2.1 打印链表
    • 2.2 尾插
    • 2.3 尾删
    • 2.4 头插
    • 2.5 头删
    • 2.6 查找
    • 2.7 在指定位置(pos)前插入
    • 2.8 在指定位置(pos)删除
    • 2.9 在指定位置(pos)后插入
    • 2.10 在指定位置(pos)后删除
    • 2.11 摧毁链表


1.链表

1.1 链表的结构和概念

概念如下: 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。

结构如下:
在这里插入图片描述

用代码可以这样表示:

struct SListNode
{
 	int val;
 	struct SListNode* next;
};

但是不属于结构体嵌套结构体!!!!!

2.(增删查改)单链表的实现

这里只展示自定义函数部分,查看完整代码可以进入我的gitee拷贝。
链接: 完整代码点这里

2.1 打印链表

void SLTPrint(SLNode* phead)
{
	SLNode* cur = phead;
	while (cur != NULL)
	{
		printf("%d ", cur->val);
		cur = cur->next;
	}
	printf("NULL\n");
}

2.2 尾插

void SLTPushBack(SLNode** pphead, SLNDataType x)
{
	SLNode* newnode = CreateNode(x);

	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{
		// 找尾
		SLNode* tail = *pphead;
		while (tail->next != NULL)
		{
			tail = tail->next;
		}

		tail->next = newnode;
	}
}

在这里插入图片描述

2.3 尾删

void SLTPopBack(SLNode** pphead)
{
	assert(*pphead);

	// 1、一个节点
	// 2、一个以上节点
	if ((*pphead)->next == NULL)
	{
		free(*pphead);
		*pphead = NULL;
	}
	else
	{
		SLNode* tail = *pphead;
		while (tail->next->next != NULL)
		{
			tail = tail->next;
		}
		free(tail->next);
		tail->next = NULL;
	}
}

在这里插入图片描述

2.4 头插

void SLTPushFront(SLNode** pphead, SLNDataType x)
{
	SLNode* newnode = CreateNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

在这里插入图片描述

2.5 头删

void SLTPopFront(SLNode** pphead)
{
	assert(*pphead);

	// 一个以上节点 + 一个
	SLNode* tmp = *pphead;
	*pphead = (*pphead)->next;
	free(tmp);
}

在这里插入图片描述

2.6 查找

SLNode* SLTFind(SLNode* phead, SLNDataType x)
{
	SLNode* cur = phead;
	while (cur != NULL)
	{
		if (cur->val == x)
		{
			return cur;
		}
		else
		{
			cur = cur->next;
		}
	}
	return NULL;
}

2.7 在指定位置(pos)前插入

void SLTInsertpre(SLNode** pphead, SLNode* pos, SLNDataType x)
{
	// 严格限定pos一定是链表里面的一个有效节点
	assert(pphead);
	assert(pos);
	assert(*pphead);

	if (*pphead == pos)
	{
		// 头插
		SLTPushFront(pphead, x);
	}
	else
	{
		SLNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}

		SLNode* newnode = CreateNode(x);
		prev->next = newnode;
		newnode->next = pos;
	}
}

在这里插入图片描述

2.8 在指定位置(pos)删除

void SLTErasepre(SLNode** pphead, SLNode* pos)
{
	assert(pphead);
	assert(*pphead);
	assert(pos);

	if (*pphead == pos)
	{
		// 头删
		SLTPopFront(pphead);
	}
	else
	{
		SLNode* prev = *pphead;
		while (prev->next != pos)
		{
			prev = prev->next;
		}

		prev->next = pos->next;
		free(pos);
		pos = NULL;
	}
}

在这里插入图片描述

2.9 在指定位置(pos)后插入

void SLTInsertAfter(SLNode* pos, SLNDataType x)
{
	assert(pos);
	SLNode* newnode = CreateNode(x);

	newnode->next = pos->next;
	pos->next = newnode;
}

在这里插入图片描述

2.10 在指定位置(pos)后删除

void SLTEraseAfter(SLNode* pos)
{
	assert(pos);
	assert(pos->next);

	SLNode* tmp = pos->next;
	pos->next = pos->next->next;

	free(tmp);
	tmp = NULL;
}

在这里插入图片描述

2.11 摧毁链表

void SLTDestroy(SLNode** pphead)
{
	assert(pphead);

	SLNode* cur = *pphead;
	while (cur)
	{
		SLNode* next = cur->next;
		free(cur);
		cur = next;
	}
	*pphead = NULL;
}

在这里插入图片描述
链接: 完整代码点这里

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

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

相关文章

骨传导蓝牙耳机推荐,2023骨传导耳机选购攻略

相信大家佩戴入耳式耳机时间长后,都会出现耳朵痛的情况,这也是这类耳机的一个通病了,为了缓解这一问题,骨传导耳机出现了,并且凭借佩戴舒适,并且不会耳痛等优点迅速成为当下最受欢迎的耳机款式,…

第14章,lambda表达式与流处理例题

package 例题;import java.util.List; import java.util.stream.Collectors; import java.util. stream.Stream;public class 例题19 { public static void main(String[] args){List<例题14> list 例题14.get例题14List();//获取公共类的测试数据Stream<例题14>…

leetCode 206.反转链表 图解

206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 class Solution { public:ListNode* reverseList(ListNode* head) {ListNode* s NULL;ListNode* phead;while(p) {headhead->nex…

分享4个MSVCP100.dll丢失的解决方法

msvcp100.dll是一个重要的动态链接库文件&#xff0c;它是Microsoft Visual C 2010 Redistributable Package的一部分。这个文件的作用是提供在运行C程序时所需的函数和功能。如果计算机系统中msvcp100.dll丢失或者损坏&#xff0c;就会导致软件程序无法启动运行&#xff0c;会…

python-jupyter实现OpenAi语音对话聊天

1.安装jupyter 这里使用的是jupyter工具&#xff0c;安装时需要再cmd执行如下命令&#xff0c;由于直接执行pip install jupyter会很慢&#xff0c;咱们直接使用国内源 pip install --user jupyter -i http://pypi.tuna.tsinghua.edu.cn/simple/ --trusted-host pypi.tuna.t…

leetcode一道比较难的链表题

今天还是继续来分享我们的链表题&#xff0c;这个题目有点难&#xff0c;主要是思路比较难想&#xff0c;但是如果沥青思路写起来就比较简单了&#xff08;我乱讲的&#xff09; 随机链表的复制 这个是题目的描述&#xff0c;大家也可以在链接里看&#xff0c;那我把这道题目…

React中组件之间如何通信?

一、是什么 我们将组件间通信可以拆分为两个词&#xff1a; 组件通信 回顾Vue系列的文章&#xff0c;组件是vue中最强大的功能之一&#xff0c;同样组件化是React的核心思想 相比vue&#xff0c;React的组件更加灵活和多样&#xff0c;按照不同的方式可以分成很多类型的组件…

Unity游戏开发基础之数据结构部分

设计模式 含义&#xff1a;帮助我们降低对象之间的耦合度常用的方法称为设计模式。使用设计模式是为了可重用代码&#xff0c;让代码更容易被其他人所理解&#xff0c;保证代码可靠性&#xff0c;使代码编制真正工程化&#xff0c;这是软件工程的基石。 分类&#xff1a; 创建…

Figma转Sketch文件教程,超简单!

相信大家做设计的都多多少少听过一点Figma和Sktech&#xff0c;这2个设计软件是目前市场上很受欢迎的专业UI设计软件&#xff0c;在全球各地都有很多粉丝用户。但是相对来说&#xff0c;Figma与Sketch只支持iOS系统有所不同&#xff0c;Figma是一个在线设计软件&#xff0c;不限…

Flink(二)【Flink 部署模式】

前言 今天是Flink学习的第二天&#xff0c;我的心情异常的复杂哈哈哈&#xff08;苦笑&#xff09;&#xff0c;学习上还是比较顺利的&#xff0c;感情上我并不擅长&#xff0c;所以心情波动大在所难免。害&#xff0c;至少还有学习让我不被各种糟糕琐碎的日常生活里的人和事所…

【2023方案开发】无刷电机自动打气泵方案

如今新能源车大行其道&#xff0c;而车厂在考虑成本和设计的情况下&#xff0c;将备胎给取消了&#xff0c;那假如在车胎气压不足的状态下&#xff0c;没有备胎更换&#xff0c;那将如何解决困境。气压不住需要打气&#xff0c;那配备一台打气泵尤为重要&#xff0c;即使常年可…

Git系列之Git入门级(带你走进Git的世界)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《Git实战开发》。&#x1f3af;&#x1f3af; &a…

论文速览 MobiCom 2023 | NeRF2 : Neural Radio-Frequency Radiance Fields

注1:本文系“最新论文速览”系列之一,致力于简洁清晰地介绍、解读最新的顶会/顶刊论文 Xiaopeng Zhao, Zhenlin An, Qingrui Pan, and Lei Yang. 2023. NeRF2: Neural Radio-Frequency Radiance Fields. In Proceedings of the 29th Annual International Conference on Mobil…

AIGC:使用生成对抗网络GAN实现MINST手写数字图像生成

1 生成对抗网络 生成对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09;是一种非常经典的生成式模型&#xff0c;它受到双人零和博弈的启发&#xff0c;让两个神经网络在相互博弈中进行学习&#xff0c;开创了生成式模型的新范式。从 2017 年以后&#x…

kubectl声明式资源管理命令

一、声明式资源管理介绍&#xff1a; 适合于对资源的修改操作声明式资源管理方法依赖于资源配置清单文件对资源进行管理资源配置清单文件有两种格式&#xff1a;yaml&#xff08;人性化&#xff0c;易读&#xff09;&#xff0c;json&#xff08;易于api接口解析&#xff09;对…

如何排查CPU飙升的问题所在

我们在线上排查问题的时候发现系统的CPU直接爆红了,如何排查问题呢?怎么快速定位问题的所在呢? linux系统下: 首先我们通过top命令来查看那个进程占用CPU过大: top 这里只是简单的模拟一下,假设java进程占用CPU很大,那么我们通过这个进程来查找进程下的线程使用CPU的情况…

【23真题】C9无歧视,专业课均分130!

今天分享的是23年哈尔滨工业大学803的信号与系统部分的试题及解析。 本套试卷难度分析&#xff1a;22年哈今天分享的是23年哈尔滨工业大学803的信号与系统部分的试题及解析。 哈尔滨工业大学803考研真题&#xff0c;我也发布过&#xff0c;若有需要&#xff0c;戳这里自取&…

6-爬虫-scrapy解析数据(使用css选择器解析数据、xpath 解析数据)、 配置文件

1 scrapy解析数据 1.1 使用css选择器解析数据 1.2 xpath 解析数据 2 配置文件 3 整站爬取博客–》爬取详情–》数据传递 scrapy 爬虫框架补充 # 1 打码平台---》破解验证码-数字字母&#xff1a;ddddocr-计算题&#xff0c;滑块&#xff0c;成语。。。-云打码&#xff0c;超…

文件上传 [GXYCTF2019]BabyUpload1

打开题目 传个是jpg文件后缀的一句话木马上去 代码如下 <script languagephp>eval($_POST[v]);</script> 发现上传成功 因此我们需要先上传 .htaccess 文件&#xff0c;然后再上传 2.jpg文件 .htaccess作用&#xff1a;文件将别的后缀名文件内容解析为php程序…

使用matlab实现图像信号的色彩空间转换

利用matlab对图像信号进行读取&#xff0c;并对RGB空间进行转换&#xff0c;如转换到HSI空间等。 下面的这个代码是在使用了rgb2hsi()方法失败后&#xff0c;进行修改的。 rgb2hsi(img)这个方法可以将RGB图像转换为HIS图像&#xff1b;但是爆出了 Untitled5(line 5)hsi rgb2h…