拿捏单链表

news2024/12/22 19:56:00

目录

引言

一:链表的定义

二:单链表的定义 

三:单链表的增删查改 

1.单链表增删查改及遍历的声明

注:在测试中创建指向头结点的指针plist 

2.二级指针应用的说明 

 3.单链表的遍历

4.创建节点 

5.单链表的插入 

(1)头插

(2) 尾插

 (3)任意位置之前插入

(4)任意位置之后插入

6.单链表的删除 

(1)头删

(2) 尾删

(3) 任意位置删除

7.单链表的查找 

8.单链表的修改 

四:关于单链表的介绍就到此为止了,青山不改,绿水长流,后会有期。 


接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 

引言

   链表是一种常见的数据结构,它可以用来存储数据,并可以快速的进行增删查改的目的。相对于数组来说链表更加灵活和高效,数组的优势在于数组下标的随机访问,链表则可以更好的解决数组容量的大小,频繁扩容等一系列问题。

   接下来本文将介绍关于链表的定义以及单链表的增删查改,知识云游号即将发车

   辞忧提醒你请系好安全带,准备发车

一:链表的定义

1.链表是由一系列的节点构成,每个节点包含一个数据内容的数据域和一个指向下一个节点的指针的指针域。

2.每个节点是由malloc申请来的,所以每个节点是在内存空间中的堆区中,并且是在堆中随即申请的,所以各结点的地址是不连续的,是随机的。并且与在栈中申请的局部变量不同,局部变量出作用域销毁,而节点是在堆中,不销毁。

3.每个链表都包含一个头节点和一个指向头结点的指针变量,用来对链表进行各种操作。每个链表的尾节点中指针域为NULL。

二:单链表的定义 

三:单链表的增删查改 

1.单链表增删查改及遍历的声明


#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

typedef int SListDatatype;

typedef struct SListNode
{
	SListDatatype data;
	struct SListNode* next;
}SLTNode;

//打印单链表数据
void SLTPrint(SLTNode*phead);

//单链表之创建节点
SLTNode* CreatNode(SListDatatype x);

//单链表之头插
void SLTPushFront(SLTNode** pphead,SListDatatype x);

//单链表之尾插
void SLTPushBack(SLTNode** pphead, SListDatatype x);

//单链表之头删
void SLTPopFront(SLTNode**pphead);

//单链表之尾删
void SLTPopBack(SLTNode **pphead);

//单链表之查找
SLTNode* SLTFindData(SLTNode** pphead, SListDatatype data);

//单链表之修改
void SLTModifyData(SLTNode** pphead, SListDatatype place,SListDatatype data);

//单链表之任意位置之前插入
void SLTPushArbit(SLTNode**pphead,SListDatatype place,SListDatatype data);

//单链表之任意位置删除
void SLTPopArbit(SLTNode** pphead, SListDatatype place);

//单链表之任意位置之后插入
void SLTPushBackArbit(SLTNode** pphead, SListDatatype place, SListDatatype data);
注:在测试中创建指向头结点的指针plist 

2.二级指针应用的说明 

二级指针顾名思义就是指向指针的指针,在最早接触指针的时候,有一个最简单的例子,就是用函数来实现两数交换,这个问题最初我们写的代码就如下

发现根本没有解决问题,主要原因是改变形参不改变实参,因此便想到运用指针的方法:

这次发现 便可以,因此要改变int类型的值必须传int*,改变int*的值必须传int**,对于单链表中的结构体也一样,改变头节点的指针,就得使用头节点指针的指针。

 3.单链表的遍历

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

4.创建节点 

SLTNode* CreatNode(SListDatatype x)
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		perror("malloc newnode");
		return ;
	}
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}

注:x为数据域的内容

5.单链表的插入 

(1)头插
void SLTPushFront(SLTNode** pphead,SListDatatype x)
{
	assert(pphead);
	SLTNode* newnode = CreatNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}

 

(2) 尾插
void SLTPushBack(SLTNode** pphead, SListDatatype x)
{
	assert(pphead);
	SLTNode* newnode = CreatNode(x);
	//1.空链表
	if (*pphead == NULL)
	{
		*pphead = newnode;
	}
	else   //2.不是空链表
	{
		//找尾
		SLTNode* cur = *pphead;
		while (cur->next != NULL)
		{
			cur = cur->next;
		}
		cur->next = newnode;
	}
}

 

 (3)任意位置之前插入
//查找代码
SLTNode* SLTFindData(SLTNode** pphead, SListDatatype x)
{
	assert(pphead);
	assert(*pphead);//空链表不需查找
	SLTNode* cur = *pphead;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}
void SLTPushFrontArbit(SLTNode** pphead, SListDatatype place,SListDatatype data)
{
	assert(pphead);
	assert(*pphead);//空链表不能任意位置插入
	SLTNode* PushPlace = SLTFindData(pphead, place);
	if (PushPlace != NULL)
	{
		if (PushPlace == *pphead)//1.只有一个节点
		{
			SLTPushFront(pphead, data);
		}
		else//2.一个以上节点
		{
			SLTNode* newnode = CreatNode(data);
			SLTNode* cur = *pphead;
			while (cur->next != PushPlace)
			{
				cur = cur->next;
			}
			cur->next = newnode;
			newnode->next = PushPlace;
		}
	}
	else
	{
		printf("无此位置");
		return;
	}
}

 

(4)任意位置之后插入
SLTNode* SLTFindData(SLTNode** pphead, SListDatatype x)
{
	assert(pphead);
	assert(*pphead);//空链表不需查找
	SLTNode* cur = *pphead;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}
void SLTPushBackArbit(SLTNode** pphead, SListDatatype place, SListDatatype data)
{
	assert(pphead);
	assert(*pphead);//空链表不需查找插入
	SLTNode* PushPlace = SLTFindData(pphead, place);
	if (PushPlace)
	{
		SLTNode* newnode = CreatNode(data);
		if (*pphead == PushPlace)//头节点之后插入
		{
			(*pphead)->next = newnode;
		}
		else if(PushPlace->next==NULL)//尾节点之后插入
		{
			SLTNode* cur = *pphead;
			while (cur != PushPlace)
			{
				cur = cur->next;
			}
			cur->next = newnode;
		}
		else
		{
			SLTNode* cur = *pphead;
			while (cur != PushPlace)
			{
				cur = cur->next;
			}
			SLTNode* curr = cur->next;
			newnode->next = curr;
			cur->next = newnode;
		}
	}
	else
	{
		printf("找不到");
		return;
	}
}

 

6.单链表的删除 

(1)头删
void SLTPopFront(SLTNode** pphead)
{
	assert(pphead);
	assert(*pphead);//空链表不能删除
	//1.只有一个节点
	if ((*pphead)->next == NULL)
	{
		*pphead = NULL;
		free(*pphead);
	}
	else  //2.一个以上节点
	{
		SLTNode* del = *pphead;
		*pphead = del->next;
		del->next = NULL;
		free(del);
	}
}

 

(2) 尾删
void SLTPopBack(SLTNode** pphead)
{
	assert(pphead);
	assert(*pphead);//空链表不能删除
	//1.只有一个节点
	if ((*pphead)->next == NULL)
	{
		*pphead = NULL;
		free(*pphead);
	}
	else
	{
		SLTNode* cur = *pphead;
		while (cur->next->next != NULL)
		{
			cur = cur->next;
		}
		cur->next = NULL;
		free(cur->next);
	}
}

 

 

(3) 任意位置删除
//查找
SLTNode* SLTFindData(SLTNode** pphead, SListDatatype x)
{
	assert(pphead);
	assert(*pphead);
	SLTNode* cur = *pphead;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}
void SLTPopArbit(SLTNode** pphead, SListDatatype place)
{
	assert(pphead);
	assert(*pphead);//空链表不能查找删除
	SLTNode* PopPlace = SLTFindData(pphead, place);
	if (PopPlace != NULL)
	{
		if (*pphead == PopPlace)//只有一个节点
		{
			SLTPopFront(pphead);
		}
		else
		{
			SLTNode* cur = *pphead;
			while (cur->next != PopPlace)
			{
				cur = cur->next;
			}
			SLTNode* del = PopPlace;
			cur->next = del->next;
			free(del);
		}
	}
	else
	{
		printf("无此位置");
		return;
	}
}

 

7.单链表的查找 

 

SLTNode* SLTFindData(SLTNode** pphead, SListDatatype x)
{
	assert(pphead);
	assert(*pphead);
	SLTNode* cur = *pphead;
	while (cur)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

8.单链表的修改 

//指定位置修改
void SLTModifyData(SLTNode** pphead, SListDatatype place,SListDatatype data)
{
	assert(pphead);
	assert(*pphead);//空链表不能修改
	SLTNode* ret = SLTFindData(pphead, place);
	ret->data = data;
}

四:关于单链表的介绍就到此为止了,青山不改,绿水长流,后会有期。 

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

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

相关文章

【深度学习:DICOM 注释工具】在 DICOM 注释工具中寻找的 7 个功能

【深度学习&#xff1a;DICOM 注释工具】在 DICOM 注释工具中寻找的 7 个功能 原生 DICOM 支持原生 3D 注释易于使用的界面DICOM 图像的自动注释质量控制功能审计跟踪SOC2 和 HIPAA 合规性 如果您尝试为医疗 AI 模型创建训练数据&#xff0c;您可能已经使用了免费的开源工具&am…

html从零开始9:javaScript简介,语句、标识符,变量,JavaScript引入到文件【搬代码】

javaScript简介 javaScript语句、标识符 变量 var num 10; var就是固定声明,num就是变量名&#xff0c;10就是变量&#xff1b;<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Comp…

【pyopenGL编程手册- 01/20】pyopenGL安装和简要说明

目录 一、说明二、测试系统安装的健康性三、安装64位的openGL四、写给程序员的4. 1 函数库介绍4.2 库内函数的命名 五、常见库的函数介绍5.1 OpenGL 核心库 GL5.2 OpenGL 实用库 GLU5.3 OpenGL 工具库 GLUT5.4 Windows 专用库 WGL 六、错误引发点和异常追踪6.1 错误检查开关6.…

人工智能学习与实训笔记(五):神经网络之推荐系统处理

目录 ​​​​​​​七、智能推荐系统处理 7.1 常用的推荐系统算法 7.2 如何实现推荐​​​​​​​ 7.3 基于飞桨实现的电影推荐模型 7.3.1 电影数据类型 7.3.2 数据处理 7.3.4 数据读取器 7.3.4 网络构建 7.3.4.1用户特征提取 7.3.4.2 电影特征提取 7.3.4.3 相似度…

TenorFlow多层感知机识别手写体

文章目录 数据准备建立模型建立输入层 x建立隐藏层h1建立隐藏层h2建立输出层 定义训练方式建立训练数据label真实值 placeholder定义loss function选择optimizer 定义评估模型的准确率计算每一项数据是否正确预测将计算预测正确结果&#xff0c;加总平均 开始训练画出误差执行结…

C++初阶(十一) list

一、list的介绍及使用 1.1 list的介绍 list的文档介绍 1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点…

爱上JVM——常见问题(一):JVM组成

1 JVM组成 1.1 JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f; 难易程度&#xff1a;☆☆☆ 出现频率&#xff1a;☆☆☆☆ JVM是什么 Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&…

巨抽象的前端vue3

根据实践证明&#xff0c;越是简单的问题&#xff0c;越容易造成大bug 一个自定义组件的路径就废了我老半天了 各种查询&#xff0c;各种百度&#xff0c;各种问&#xff0c;结果规规矩矩去导入组件路径&#xff0c;成了&#xff01; 错误代码&#xff1a; <script setu…

canal监听binlog记录业务数据的变更;canalAdmin对instance做web配置

概述 平时在开发中会通过logback打印一些开发日志&#xff0c;有时也会需要记录一些业务日志&#xff0c;简单的就直接用log记录一下&#xff0c;但是系统中需要记录日志的地方越来越多时&#xff0c;不能每个地方都写一套log记录&#xff1b; 由于平常用的大多都是mysql&…

c语言遍历文件夹中的文件

文件目录如下&#xff0c;文件夹里还有一些txt文件未展示出来。 使用递归实现&#xff0c;深度优先遍历文件夹中的文件。 代码如下&#xff0c;用了一点C的语法。 #include <io.h> #include <iostream> using namespace std;#define MAX_PATH_LENGTH 100int Tr…

创新技巧|迁移到 Google Analytics 4 时如何保存历史 Universal Analytics 数据

Google Universal Analytics 从 2023 年 7 月起停止收集数据&#xff08;除了付费 GA360 之外&#xff09;。它被Google Analytics 4取代。为此&#xff0c;不少用户疑惑&#xff1a;是否可以将累积&#xff08;历史&#xff09;数据从 Google Analytics Universal 传输到 Goog…

@ControllerAdvice 的介绍及三种用法

ControllerAdvice 的介绍及三种用法 浅析ControllerAdvice 首先&#xff0c;ControllerAdvice本质上是一个Component&#xff0c;因此也会被当成组建扫描&#xff0c;一视同仁&#xff0c;扫扫扫。 然后&#xff0c;我们来看一下此类的注释&#xff1a; 这个类是为那些声明了&…

智胜未来,新时代IT技术人风口攻略-第四版(弃稿)

文章目录 前言鸿蒙生态科普调研人员画像高校助力鸿蒙高校鸿蒙课程开设占比教研力量并非唯一原因 企业布局规划全盘接纳仍需一段时间企业对鸿蒙的一些诉求 机构入场红利机构鸿蒙课程开设占比机构对鸿蒙的一些诉求 鸿蒙实际体验高校用户群体高度认同与影响体验企业用户群体未来可…

【数据分享】2001~2020年青藏高原植被净初级生产力数据集

各位同学们好&#xff0c;今天和大伙儿分享的是2001~2020年青藏高原植被净初级生产力数据集。如果大家有下载处理数据等方面的问题&#xff0c;您可以私信或评论。 朱军涛. (2022). 青藏高原植被净初级生产力数据集&#xff08;2001-2020&#xff09;. 国家青藏高原数据中心. …

基于STM32的老人心率监测系统

1. 系统设计 本次课题为基于STM32的老人心率监测系统&#xff0c;在此设计了如图2.1所示的系统结构框图&#xff0c;整个系统包括了MAX30102心率血氧检测模块&#xff0c;SIM800短信模块&#xff0c;液晶显示模块&#xff0c;按键&#xff0c;ESP8266无线通信模块以及主控制器s…

WIN11 WSL2 Ubuntu系统删除Docker镜像后磁盘空间未减少问题解决办法

因为 windows 中的 docker 使用虚拟磁盘&#xff08;VHDX&#xff09;来存储文件系统。 windows中&#xff0c;docker需在WSL2配置下才可使用。 &#xff08;WSL是windows推出的可让开发人员不需要安装虚拟机(vmware,virtbox)或者设置双系统启动就可以原生支持运行GNU/Linux的…

CSS 不同颜色的小圆角方块组成的旋转加载动画

<template><!-- 创建一个装载自定义旋转加载动画的容器 --><view class="spinner"><!-- 定义外部包裹容器,用于实现整体旋转动画 --><view class="outer"><!-- 定义四个内部小方块以形成十字形结构 --><view clas…

【初始消息队列】消息队列的各种类型

消息队列相关概念 什么是消息队列 MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。在互联网架构中…

多线程的基本原理学习

由一个问题引发的思考 线程的合理使用能够提升程序的处理性能&#xff0c;主要有两个方面&#xff0c;第一个是能够利用多核cpu以及超线程技术来实现线程的并行执行&#xff1b;第二个是线程的异步化执行相比于同步执行来说&#xff0c;异步执行能够很好的优化程序的处理性能提…

智慧公厕管理软件

随着城市化的不断推进&#xff0c;城市公共设施逐渐完善&#xff0c;其中智慧公厕的建设也在不断提速。智慧公厕作为城市基础设施的重要组成部分&#xff0c;对城市卫生水平提升有着不可忽视的作用。而智慧公厕管理软件更是智慧公厕管理的基础&#xff0c;是公共厕所智慧化管理…