数据结构——C语言单链表的实现

news2024/9/20 5:16:20

单链表的实现

  • 一.链表的节点
  • 二.如何在在链表中插入数据
    • 1.尾插
    • 2.改进
    • 3.头插
    • 4.指定位置pos,在pos前插入数据
  • 三 .删除数据
    • 1.头删
    • 2.尾删
    • 3.指定位置删除数据

一.链表的节点

//链表中的数据类型,方便后续的更改
typedef int SLTDatatype;

//链表的节点
typedef struct SLTNode
{
	SLTDataType data;
	struct SLTNode* next;
}SLTNode;

二.如何在在链表中插入数据

1.尾插

void SLTPushBack(SLTNode** pphead,SLTDataType x)
{
	//给要插入的数据创造一个新的节点
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if(newnode == NULL)
	{
		perror("malloc fail");
	}
	newnode->data = x;
	newnode->next = NULL;
	
	//如果*pphead为空,就让它指向第一个节点
	//否则就找到最后一个节点,让最后一个节点的next指向新节点
	if(*pphead == NULL)
	{
		*pphead = newnode;
	}
	else
	{
		SLTNode* tail = *pphead;
		while(tail->next)
		{
			tail = tail->next;
		}
		tail->next = newnode;
	}
}

但是这里我们为什么要使用二级指针呢?
在这里插入图片描述

  1. 因为我的这个单链表是没有哨兵位的(也就是说我们是用指针指向了第一个节点),如果是有哨兵位的话,哨兵位就是第一个节点。
  2. 因为我们是用指针指向的第一个节点,要改变第一个指针的内容,我们只能用二级指针来接收一级指针。一级指针传给一级指针相当于值传递
    在这里插入图片描述

2.改进

之后我们不管是,尾插,还是中间插入都要进行一步相同的操作(创建新节点),所以我们把它提出来,单独作为一个函数。

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

	return newnode;
}

3.头插

新节点的下一个节点指向原来的头节点,再把头节点指向新节点

void SLTPushFront(SLTNode** pphead, SLTDataType x)
{
	assert(pphead);

	SLTNode* newnode = BuySLTNode(x);

	newnode->next = *pphead;
	*pphead = newnode;
}

4.指定位置pos,在pos前插入数据

要指定位置pos,我们还要写一个查找函数
找到了我们要的数据就返回它的地址,没有就返回NULL

SLTNode* SLTFind(SLTNode* phead,SLTDateType x)
{
	assert(phead);
	SLTNode* cur = phead;
	while(cur)
	{
		if(cur->data = x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

在这里插入图片描述
如果是在头节点前插入数据,我们可以直接调用之前写好的头插。
其它节点前插入数据,我们需要知道原本在这个节点前的数据地址,让它的next指向要插入的节点,将插入节点的next指向被插入的节点。

//在pos位置前插入数据
void SLTInsert(SLTNode** pphead, SLTNode* pos, SLTDataType x)
{
	assert(pphead);
	assert(pos);


	SLTNode* cur = *pphead;
	if (cur == pos)
	{
		SLTPushFront(pphead,x);
	}
	else
	{
		while (cur->next != pos)
		{
			cur = cur->next;
		}

		SLTNode* newnode = BuySLTNode(x);
		cur->next = newnode;
		newnode->next = pos;
	}
}

三 .删除数据

1.头删

要先保留头节点的地址,让头节点指向头节点下一个节点的地址,最后释放掉保留下来的原来的头节点

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

	SLTNode* erase = *pphead;
	*pphead = (*pphead)->next;
	free(erase);
	erase = NULL;
}

2.尾删

找到最后一个节点的前一个节点,释放掉最后一个节点,最后一个节点的next指向NULL
如果只有一个节点,那就释放掉它,然后phead指针指向NULL(函数中的*pphead 等价于 phead)

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

	SLTNode* cur = *pphead;
	while (cur->next && cur->next->next)
	{
		cur = cur->next;
	}
	if (cur->next == NULL)
	{
		free(cur);
		*pphead = NULL;
	}
	else
	{
		free(cur->next);
		cur->next = NULL;
	}
}

3.指定位置删除数据

如果是删除的第一个位置的节点,调用头删。
其他节点的删除,在循环是我们需要注意保留被删除元素的前一个元素的地址,最后用被删除元素的前一个元素的next指向,被删除元素的next,最后释放掉被删除元素。

//删除pos位置的数据
void SLTErase(SLTNode** pphead, SLTNode* pos)
{
	assert(pphead);
	assert(pos);

	SLTNode* cur = *pphead;
	if (cur == pos)
	{
		SLTPopFront(pphead);
	}
	else
	{
		while (cur->next != pos)
		{
			cur = cur->next;
		}
		cur->next = pos->next;
		free(pos);
	}
}

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

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

相关文章

学习ROS2第一天—新手笔记(humble版本)

————今早七点达到实验室,吃了早饭收拾了一下现在07:24开始学习———— 1. RO2与ROS1的不同架构: ROS1架构下,所有节点都是Master进行管理 ROS使用基于DDS的Discovery机制,和Master说再见 API的重新设计 编译…

查看ip地址的方法有几种?探索多样方法

在当今数字化时代,IP地址作为网络设备的唯一标识符,在网络连接、数据传输、网络安全等方面扮演着至关重要的角色。无论是普通用户进行网络设置,还是网络管理员进行故障排查,了解如何查看IP地址都是一项基础且必备的技能。本文将深…

2-99 基于matlab多尺度形态学提取眼前节组织

基于matlab多尺度形态学提取眼前节组织,通过应用不同尺度的结构元素进行边缘检测,再通过加权融合的思想来整合检测到的边缘,降低图像噪声的影响,提高边缘检测的精度。程序已调通,可直接运行。 下载源程序请点链接&…

18.DHT11编程案例

温湿度传感器 产品概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用领域:暖通 空调;汽车;消费品;气象站;湿度调节器;除湿器;家电;医疗…

傅里叶变换的基本性质和有关定理

一、傅里叶变换的基本性质 1.1 线性性质 若 则 其中:a,b是常数 函数线性组合的傅里叶变换等于歌函数傅里叶变换的相应组合。 1.2 对称性 若 则 关于傅里叶变换的对称性还有 虚、实、奇、偶函数的傅里叶变换性质: 1.3 迭次傅里叶变换 对f(x,y)连续两次做二维傅里叶变换…

shell指令及笔试题

一:linux基本指令考察 创建文件,直接在本目录的上级目录下创建一个名为dir1的文件夹,并在dir1文件夹下创建一个名为file1的文件 答:本目录的上级目录下创建一个名为dir1的文件:mkdir ../dir1 在dir1文件夹下创建一个名为file1的…

【CSS in Depth 2 精译_034】5.4 Grid 网格布局的显示网格与隐式网格(下)

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结) 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位(已完结) 2.1 相对…

美容美发会员查看源码--———未来之窗行业应用跨平台架构

一、 会员详情查看源码 var obj_未来之窗数据 ;var 未来之窗传送id "这几个举个中文";CyberWin_ClientRender(模板).render(obj_未来之窗数据, function(未来之窗response){CyberWin_Dialog.layer(未来之窗response,{type:"frame",title:"会员详情&q…

C:字符串函数(完)-学习笔记

目录 前言: 1、strstr 1.1 strstr的使用 4.2 strstr的模拟实现 5、strtok 5.1 strtok函数的介绍 5.2 strtok函数的使用 6、strerror 前言: 这篇文章将介绍strstr函数,strtok函数,strerror函数 1、strstr 1.1 strstr的使用…

基于51单片机的温度电流电压检测系统(压力、电压、温度、电流、LCD1602)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,通过DS18B20检测温度,滑动变阻器连接数模转换器模拟电流、电压,通过LCD1602显示,程序里设置温度阈值为40,电流阈值为60&am…

使用Python免费将pdf转为docx

刚刚想将pdf转换为docx文档时,居然要收费 还好我学过编程,这不得露两手 将pdf 转换为 docx 文档 的操作步骤 我这里使用的是Python语言 (1)在终端上安装 pdf2docx 是一个 Python 库,它可以将 PDF 文件转换为 Word (…

CS61C 2020计算机组成原理Lab03

Exercise 1: Familiarizing yourself with Venus .data .word 2, 4, 6, 8 n: .word 9.text main: # add t0, x0, x0# addi 是 "add immediate"(立即数加法)的缩写,表示这是一个加法指令,其中一个加数是一个立即数&am…

try语句块和异常处理

throw直接报错 int main() {if (true) throw std::runtime_error("Error!"); } runtime_error(或者其他错误类型)是一个类, 必须初始化, 需使用string或者c风格字符串初始化. throw放try里, catch会接住throw的error 大概就是[catch]-->{[throw]-->[try]}的关…

数据结构——二叉树堆的专题

1.堆的概念及结构 如果有一个关键码的集合K {K0 &#xff0c;K1 &#xff0c;K2 &#xff0c;K3…&#xff0c;K(N-1) }&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;并满足&#xff1a;Ki < K2*i1且 Ki<K2*i2 ) i 0&#…

Java语言程序设计基础篇_编程练习题**18.30 (找出单词)

题目&#xff1a;**18.30 (找出单词) 编写一个程序&#xff0c;递归地找出某个目录下的所有文件中某个单词出现的次数。从命令行如下传递参数&#xff1a; java Exercise18_30 dirName word 习题思路 &#xff08;读取路径方法&#xff09;和18.28题差不多&#xff0c;把找…

电子元件制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

5G智能工厂与物联数字孪生平台的融合应用&#xff0c;不仅为电容器制造业注入了新的活力&#xff0c;更为整个制造业的数字化转型树立了新的标杆。电子元件制造过程中&#xff0c;数字孪生平台通过实时监测生产线的各个环节&#xff0c;实现了生产流程的可视化监控。管理人员可…

vue中的slot插槽,彻底搞懂及使用

1、使用slot站位&#xff0c;不传内容&#xff0c;显示默认值 //父组件 import SlotChild from ./projectConstruction-child/SlotChild.vue <div><SlotChild></SlotChild> </div>//子组件 <template><div>下面是插槽内容</div><…

【爆炸】BB机,BP机,寻呼系统基础知识,物理层讲解

本页介绍寻呼系统基础知识。其中提到了寻呼机使用的数字协议并描述了数字寻呼接收器。 寻呼是一种单向通信系统。寻呼系统向携带小型电池供电设备&#xff08;称为寻呼机&#xff09;的个人广播信号或消息。这是与员工和/或客户沟通的非常重要的方式。让我们看看寻呼系统的工作…

新发布的OpenAI o1生成式AI模型在强化学习方面迈出了重要的一步

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Xv6驱动(四):CLINT

阅读材料 Xv6代码&#xff1a;memlayout.h、start.c、kernelvec.S教材5.4节 CLINT内存映射 实际上&#xff0c;CLINT还包括若干个MSIP寄存器&#xff0c;用来触发软件中断&#xff0c;但是在Xv6中不考虑软件中断&#xff0c;因此这些寄存器也不用考虑 // core local interr…