【C语言零基础入门篇 - 15】:单链表

news2024/11/15 11:17:44

文章目录

  • 单链表
  • 链表的基本概念
    • 单链表功能的实现
      • 单链表的初始化
      • 单链表新结点的创建
      • 单链表头插法
      • 单链表的输出
      • 单链表的查找
      • 单链表修改
      • 单链表的删除
      • 单链表所有数据结点释放
      • 源代码

单链表


链表的基本概念

一、什么是链表?
链表是数据结构中线性表的一种,其中的每个元素实际上是一个单独的结构体对象,而所有对象都通过每个元素中的指针链接在一起。

什么是结点:链表中每个结构体对象叫做结点。

什么是首元结点:其中第一个数据结点。

什么是头结点:如果第一个结点不用于存储数据,只用于代表链表的起始点,则这个结点称为链表的头结点。
在这里插入图片描述
二、单链表的特点

1、单链表没有固定的长度,可以自由增加节点。

2、单链表能够实现快速的插入删除数据。

3、与数组类似,单链表也是一种线性数据结构。

4、单链表的尾结点的后继必定指向空。

单链表和数组的区别:数组是顺序存储的,而单链表是链式存储的。

链表的结构示意图:
在这里插入图片描述

单链表功能的实现

链表的基本操作:增、删、改、查。
单链表节点的插入和删除结构示意图:
在这里插入图片描述

单链表的初始化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单链表新结点的创建

在这里插入图片描述

单链表头插法

在这里插入图片描述

在这里插入图片描述

单链表的输出

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单链表的查找

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

单链表修改

在这里插入图片描述
在这里插入图片描述

单链表的删除

在这里插入图片描述
在这里插入图片描述

  • 单链表删除结点的补充:
    在这里插入图片描述

单链表所有数据结点释放

在这里插入图片描述
在这里插入图片描述

源代码

#include<stdio.h>
#include<stdlib.h>
#define TYPE int //数据类型通过定义宏的形式来进行灵活运用
#define PRINT(a) printf("%d-->", a)
#define PRINTINDEX(b, c) printf("元素值是%d\t 位置是%d\n\n", b,c)
//结点的类型 声明结点的类型
struct NODE
{
	int data; //数据域
	struct NODE*next; //指针域保存下一个结点的地址 struct NODE*
	//next是一个成员
};

//头结点类型 链表结构
struct List
{
	int len; //保存单链表中的结点个数(不包括头结点)
	struct NODE*front; //头指针 指向首元结点
	struct NODE*back; //尾指针 指向尾结点
};

//创建单链表结构 从堆区来申请内存 把首地址返回给list
struct List*initList()
{
	//申请单链表结构内存
	struct List*temp = (struct List*)malloc(sizeof(struct List));
	//初始化单链表结构的成员
	temp->len = 0;
	temp->front = NULL;
	temp->back = NULL;
	return temp;
}

//单链表结点的创建
struct NODE*CreateNode(TYPE data)
{
	struct NODE*temp = (struct NODE*)malloc(sizeof(struct NODE));
	temp->data = data; //把数据放进新结点
	temp->next = NULL; //防止野指针的出现
	return temp;
}

//单链表结点的插入 头插法
void insertHead(struct List*head, TYPE data) //list表示要增加数据的单链表
{
	//1、作为第一个数据结点插入单链表中  头指针与尾指针都需要改变指向
	if (head->front == NULL) //或者head->len == 0
	{
		//1、要生成一个新的结点
		//2、让头指针和尾指针都指向这个新结点
		head->front = head->back = CreateNode(data);
		head->len++;//单链表结点的数量+1
	}
	else//不是第一个数据结点 只需改变头指针的指向
	{
		//生成一个新的结点
		struct NODE*S = CreateNode(data);
		//新结点S指针域保存原来的首元结点的地址
		S->next = head->front;
		//更新头指针,指向新结点S
		head->front = S;
		head->len++; //单链表结点的数量+1
	}
}

//输出单链表中所有的数据
void print(struct List*head)
{
	struct NODE*p = head->front;
	while (p != NULL)
	{
		PRINT(p->data); //输出p指向的结点里面的数据
		p = p->next; //p指向下一个结点
		//p++;不能使用,单链表的物理内存不连续
	}
	printf("\n\n");
}

//单链表元素的查找 根据指定值来查找元素,并且输出元素的位置
void find(struct List*head, int val) //head=list val表示要查找的数据
{
	struct NODE*p = head->front;//p指向首元结点
	int index = 0; //index表示指定元素的位置
	while (p != NULL)
	{
		index++;
		if (p->data == val)
		{
			PRINTINDEX(p->data, index);//输出元素值和位置
		}
		p = p->next; //p指向下一个结点
	}
}

//单链表元素的修改 根据指定值
void modify(struct List*head, TYPE val, TYPE data)
//val要被修改的数据 data要修改成的数据
{
	struct NODE*p = head->front; //p指向首元结点
	while (p != NULL)
	{
		if (p->data == val)
		{
			p->data = data;//修改数据
		}
		p = p->next; //p指向下一个结点
	}
}

//单链表的删除 根据指定值来删除数据
void delete(struct List*head, TYPE val) //head=list val表示要被删除的数据
{
	//1、要找到要被删除的数据
	struct NODE*p1 = head->front; //p指向首元结点
	struct NODE*p2 = NULL;
	while (p1 != NULL)
	{
		if (p1->data == val) //找到了要被删除的数据
		{
			//情况一:p1指向是首元结点,需要更新头指针的指向
			if (p1 == head->front)
			{
				head->front = p1->next; //让p1的直接后继结点成为新的首元结点
				free(p1);
				p1 = head->front; //让p1指向新的首元结点
			}
			//情况二:p1指向的是尾结点,需要更新尾指针
			else if (p1 == head->back)
			{
				p2->next = p1->next; //给尾指针的结点域置空
				head->back = p2;
				free(p1);
				p1 = NULL;
			}
			//情况三:p1指向的结点是中间结点
			else
			{
				//p2的指针域指向p1的后继结点
				p2->next = p1->next;
				//释放删除结点
				free(p1);
				//更新p1
				p1 = p2->next;
			}
		}
		else //p2指向p1的前驱节点
		{
			p2 = p1;
			p1 = p1->next;
		}
	}
}

//假设头结点也是struct node
void delete2(struct NODE*head, TYPE val) //val表示要被删除的数据
{
	struct NODE*p1 = head;
	struct NODE*p2 = head->next;
	while (p2 != NULL)
	{
		if (p2->data = val)
		{
			p1->next = p2->next;
			free(p2);
			p2->next = p1->next;
		}
		else
		{
			p1 = p1->next;
			p2 = p2->next;
		}
	}
}

//整个单链表结点的释放 释放所有的数据结点 不是释放头节点
void AllClear(struct List*head)
{
	struct NODE*p = head->front; //p指向首元结点
	while (p != NULL)
	{
		head->front = p->next;
		free(p);
		p = head->front;
	}
	head->front = head->back = NULL;//防止野指针出现
}

int main()
{
	struct List *list = NULL; //list指向单链表 通过list来管理这个单链表
	list = initList(); //调用创建单链表函数
	//插入5个数据
	for (int j = 1; j <= 5; j++)
	{
		insertHead(list, j);
	}
	print(list);
	//find(list, 4);

	//modify(list, 5, 9);
	//print(list);
	delete(list, 4);
	print(list);

	AllClear(list);
	print(list);


	return 0;
}

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

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

相关文章

element ui实现全局el-dialog可拖拽

此情况适用于在已有项目中&#xff0c;想实现全局拖拽弹出框&#xff0c;而逐一添加拖拽自定义指令会过于麻烦的情况下&#xff0c;这种情况可以尝试下此方法。 话不多说&#xff0c;直接上代码&#xff1a; 1.先在src下新建一个config文件夹&#xff0c;里面再新建一个dialog…

【MySQL 03】表的操作

目录 1.在数据库内创建表 2.表的查询 3.表的插入 往数据库中插入数据 4.表的修改 5.删除表 1.在数据库内创建表 create table 表名(字段1 字段1类型); 这样我们就创建好了一张表&#xff0c;我们可以进入hellosql目录下进行查看&#xff1a;所以在数据库内建立表&#xf…

python绘制弦图-科研作图

一、背景 弦图以其直观、精美的展示方式受到越来越多人的关注&#xff0c;它不仅能够有效展示两个变量之间的联系&#xff0c;还能同时展现多个变量间的复杂互动&#xff0c;本文将通过Python语言中的pycirclize库&#xff0c;带你深入了解如何绘制弦图。 弦图是一种圆…

linux中vim编辑器的应用实例

前言 Linux有大量的配置文件&#xff0c;其中编辑一些配置文件&#xff0c;最常用的工具就是 Vim &#xff0c;本文介绍一个实际应用的Vim编辑器开发文档的实例。 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多特性。…

力扣 92.反转链表Ⅱ

力扣《反转链表》系列文章目录 刷题次序&#xff0c;由易到难&#xff0c;一次刷通&#xff01;&#xff01;&#xff01; 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段24. 两两交换链表中的节点两个一组反转链表 题解225. K 个一组翻转链表K …

基尔霍夫衍射理论

一、矢量理论到标量理论 前提条件:介质同时具有线性、各向同性、均匀性且无色散。 结论:电场和磁场的所有分量的行为完全相同,可由单一的一个标量波动方程描述,标量理论可以完全准确的代替矢量理论。 若介质不具备上述前提,则用标量理论来表征矢 量理论就会引入误差。 …

【C++】继承(上)

个人主页~ 继承 一、继承的概念以及定义1、继承的概念2、继承的定义&#xff08;1&#xff09;定义格式&#xff08;2&#xff09;继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域 一、继承的概念以及定义 1、继承的概念 继承机制是面向对象程序…

【C语言零基础入门篇 - 17】:排序算法

文章目录 排序算法排序的基本概念冒泡排序选择排序插入排序 排序算法 排序的基本概念 1、什么是排序&#xff1f; 排序是指把一组数据以某种关系&#xff08;递增或递减&#xff09;按顺序排列起来的一种算法。 例如&#xff1a;数列 8、3、5、6、2、9、1、0、4、7 递增排序…

Windows 配置docker和ubuntu系统

windos10 配置docke时&#xff0c;无意间发现wsl功能挺好用&#xff0c;而且是和docker 的linux容器连通的。 记录一下解决的几个问题 error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.40/images/json: open //./pipe/docker_engine: The system cannot …

音乐项目,总结

今天的写的思路都挺简单的但是比较繁琐&#xff0c;这个查找&#xff0c;传文件的话可以了&#xff0c;但是没有用分片传送&#xff0c;然后在写音乐播放的处理&#xff0c;<歌单&#xff0c;二级评论&#xff0c;歌曲歌词滚轮播放>三个还没有实现&#xff0c;时间挺紧张…

Spring 源码分析

Spring 源码版本 4.2.8.RELEASE Bean 生命周期 动态代理 代理模式 优点: 在不修改目标对象的功能前提下&#xff0c;能通过代理对象对目标功能扩展缺点: 代理对象需要与目标对象实现一样的接口&#xff0c;所以会有很多代理类&#xff0c;一旦接口增加方法&#xff0c;目标对…

HarmonyOS鸿蒙开发实战(5.0)悬浮窗拖拽和吸附动画实践

鸿蒙HarmonyOS NEXT开发实战往期文章必看&#xff08;持续更新......&#xff09; HarmonyOS NEXT应用开发性能实践总结 HarmonyOS NEXT应用开发案例实践总结合集 最新版&#xff01;“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线&#xff01;&#xff08;从零基础入门…

spring揭秘22-springmvc01-概述

文章目录 【README】【1】MVC模式实现web应用架构【1.1】MVC模式【1.2】单个集中式控制器实现【1.2.1】引入2层控制器 【2】springmvc概述【2.1】一级控制器&#xff1a;DispatcherServlet【2.1.1】HandlerMapping处理器映射【2.1.2】springmvc二级控制器Controller【2.1.3】Vi…

【自动驾驶】控制算法(十)深度解析车辆纵向控制 | Carsim 油门刹车标定表的制作

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

7款国内AI搜索引擎大全网站

与传统搜索引擎相比&#xff0c;AI搜索引擎利用先进的自然语言处理、机器学习和深度学习技术&#xff0c;提供更加精准和个性化的搜索服务。小编就来和大家分享国内免费的AI搜索引擎网站&#xff0c;方便大家体验使用。 AI搜索引擎网站大全&#xff1a;https://www.bgrdh.com/f…

java日志框架之Log4j

文章目录 一、Log4j简介二、Log4j组件介绍1、Loggers (日志记录器)2、Appenders&#xff08;输出控制器&#xff09;3、Layout&#xff08;日志格式化器&#xff09; 三、Log4j快速入门四、Log4j自定义配置文件输出日志1、输出到控制台2、输出到文件3、输出到数据库 五、Log4j自…

ESP32无线WiFi蓝牙SOC,设备物联网通信方案,启明云端乐鑫代理商

在当今数字化时代&#xff0c;物联网(IoT)正迅速成为连接我们生活各个方面的无形纽带&#xff0c;越来越多的日常物品被赋予了智能功能&#xff0c;从灯泡到插座&#xff0c;从门锁到家电设备&#xff0c;这些设备正在改变我们与家庭环境的互动方式。 随着智能产品的普及&…

*C++:string

一.STL简介 1.STL STL(standard template libaray- 标准模板库 ) &#xff1a; 是 C 标准库的重要组成部分 &#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 。 2.STL六大组件 二.标准库里的string类 标准string库网址&#xff1…

【AI算法岗面试八股面经【超全整理】——NLP】

AI算法岗面试八股面经【超全整理】 概率论【AI算法岗面试八股面经【超全整理】——概率论】信息论【AI算法岗面试八股面经【超全整理】——信息论】机器学习【AI算法岗面试八股面经【超全整理】——机器学习】深度学习【AI算法岗面试八股面经【超全整理】——深度学习】NLP【A…

Crack道路裂缝检测数据集——目标检测数据集

【Crack道路裂缝检测数据集】共3684张。 目标检测数据集&#xff0c;标注文件为YOLO适用的txt格式。已划分为训练、验证集。 图片分辨率&#xff1a;224*224 类别&#xff1a;crack Crack道路裂缝检测数据集 数据集描述 该数据集是一个专门用于训练和评估基于YOLO&#xff0…