线性表操作的实现--单链表(链式存储结构)

本文参考朱战力老师的数据结构与算法--使用C语言一书

目录

文章目录

前言

一、链表是什么?

二、具体实现

1.单链表的定义

2.初始化ListInitiate(SLNode **head)

3.求当前元素的个数ListLength(SLNode *head)

4.插入ListInsert(SLNode *head,int i,DataType x)

5.删除ListDelete(SLNode *head,int i,DataType *x)

6.取元素ListGet(SLNode *head,int i,DataType *x)

 7.撤销单链表Destroy(SLNode **head)

  8.链表排序ListSort(SLNode* head)

  9.链表查找ListSearch(SLNode* head, DataType target)

  10.小试牛刀

总结


前言

        本文所介绍的内容为数据结构与算法的基础内容--顺序表操作的实现,笔者通过不断的深入学习发现,后续的数据结构中,包括堆栈、队列、串、数组、表、数和二叉树无不是通过线性表去实现,故很好的理解线性表的操作对于广大的读者来说非常的有必要!


一、链表是什么?

        本篇文章讨论线性表的链式存储结构和链式存储结构下操作的实现。链式存储结构存储线性表元素的方法是,把存储有元素的结点用指针域构造成链。指针是指向物理内存单元地址的变量。我们把一个由元素域及一个或若干个指针域组成的结构体称为一个结点。其中,数据域用来存放元素,指针域用来构造元素之间的关联关系。链式存储结构的特点是,元素间的逻辑关系表现在结点的链接关系上。链式存储结构的线性表称为链表。根据指针域的不同和结点构造链的方法不同,链表主要有单链表、循环单链表和双向循环链表三种。其中单链表是最经常使用的链表。

二、具体实现

1.单链表的定义

代码如下(示例):

typedef struct Node {DataType data;struct Node* next;
}SLNode;

2.初始化ListInitiate(SLNode **head)

代码如下(示例):

void ListInitiate(SLNode** head) {	//初始化*head = (SLNode*)malloc(sizeof(SLNode));	//申请头结点,由head指示其地址(*head)->next = NULL;	//置结束标志NULL
}

说明:在初始化操作前,头指针参数head没有具体的地址值。在初始化操作时,头指针参数head才得到了具体的地址值,而这个地址值要返回给调用函数,所以,此时头指针参数head要设计成双重指针(指针的指针)类型。如果此时头指针参数head设计成指针类型,那么调用函数将无法得到在初始化函数中被赋值的头指针参数head的值。

3.求当前元素的个数ListLength(SLNode *head)

代码如下(示例):

int ListLength(SLNode* head) {SLNode* p = head;	//p指向头结点int size = 0;	//size初始为0while (p->next != NULL) {	//循环计数p = p->next;size++;}return size;
}

算法实现过程:

4.插入ListInsert(SLNode *head,int i,DataType x)

代码如下(示例):

int ListInsert(SLNode* head, int i, DataType x) {//在带头结点的单链表head的第i给结点前插入一个存放元素x的结点//插入成功则返回1,失败则返回0SLNode* p, * q;int j;p = head;j = -1;while (p->next != NULL && j < i - 1) {//最终让指针p指向第i-1个结点p = p->next;j++;}if (j != i - 1) {printf("插入元素位置参数错!");return 0;}q = (SLNode*)malloc(sizeof(SLNode));	//生成新结点q->data = x;							//新结点数据域赋值q->next = p->next;						//插入步骤1p->next = q;							//插入步骤2return 1;
}

算法实现过程:

5.删除ListDelete(SLNode *head,int i,DataType *x)

代码如下(示例):

int ListDelete(SLNode* head, int i, DataType* x) {//删除带头结点单链表head的第i(0~size-1)个结点//被删除结点的数据域值由x带回,删除成功则返回1,失败则返回0SLNode* p, * s;int j;p = head;j = -1;while (p->next != NULL && p->next->next != NULL && j < i - 1) {//循环结束时指针p指向第i-1个结点p = p->next;j++;}if (j != i - 1) {printf("删除元素位置参数错!");return 0;}s = p->next;		//指针s指向第i个结点*x = s->data;		//把指针s所指结点的数据域值赋予xp->next = p->next->next;		//删除free(s);			//释放指针s所指结点的内存空间return 1;
}

算法实现过程:

6.取元素ListGet(SLNode *head,int i,DataType *x)

代码如下(示例):

int ListGet(SLNode* head, int i, DataType* x) {SLNode* p;int j;p = head;j = -1;while (p->next != NULL && j < i) {p = p->next;j++;}if (j != i) {printf("取元素位置参数错!");return 0;}*x = p->data;return 1;
}

 7.撤销单链表Destroy(SLNode **head)

代码如下(示例):

void Destroy(SLNode** head) {SLNode* p, * p1;p = *head;while (p != NULL) {p1 = p;p = p->next;free(p1);}*head = NULL;
}

  8.链表排序ListSort(SLNode* head)

代码如下(示例):

void ListSort(SLNode* head) {if (head == NULL || head->next == NULL) {return;		//空链表或只有一个结点,无需进行排序}SLNode* p, * q;DataType temp;int len = ListLength(head);for (int i = 0; i < len - 1; i++){p = head->next;q = head->next->next;for (int j = 0; j < len - 1 - i; j++){if (p->data > q->data){temp = p->data;p->data = q->data;q->data = temp;}p = p->next;q = q->next;}}
}

  9.链表查找ListSearch(SLNode* head, DataType target)

代码如下(示例):

int ListSearch(SLNode* head, DataType target) {if (head == NULL){return -1;	//空链表,查找失败}SLNode* p = head->next;int index = 0;while (p != NULL){if (p->data == target){return index;	//找到目标值,返回索引}p = p->next;index++;}return -1;
}

  10.小试牛刀

代码如下(示例):

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>	//包含printf()
#include<malloc.h>	//包含malloc()等函数
typedef int DataType;	//定义DataType为int
#include"LinList.h"	//包含LinList.h头文件
void main() {SLNode* head;	//定义头指针变量int i, x;ListInitiate(&head);	//初始化for (i = 0; i < 10; i++)	//插入10个元素{ListInsert(head, i, i + 1);}ListDelete(head, 3, &x);	//删除元素4for (i = 0; i < ListLength(head); i++) {	//显示当前的元素ListGet(head, i, &x);	//取元素printf("%d	", x);		//显示}// 测试排序函数printf("\n\n排序后的链表:\n");ListSort(head);for (i = 0; i < ListLength(head); i++) {	//显示当前的元素ListGet(head, i, &x);	//取元素printf("%d	", x);		//显示}// 测试查找函数int target = 7;int index = ListSearch(head, target);if (index != -1) {printf("\n\n目标值 %d 在链表中的索引位置为 %d\n", target, index);}else {printf("\n\n目标值 %d 不在链表中\n", target);}Destroy(&head);				//撤销单链表
}

运行结果:


总结

        

        单链表是一种常见的数据结构,它由节点组成,每个节点包含数据和指向下一个节点的指针。在本文中,我们实现了单链表的一些基本操作,包括插入、删除、排序和查找等。

        通过插入操作,我们可以在链表中添加新的节点。删除操作可以帮助我们删除指定节点。排序操作可以根据特定的规则对链表进行排序,使得节点按照一定的顺序排列。查找操作可以在链表中寻找特定的节点,并返回其位置或者相关信息。

        这些操作的实现需要注意指针的运用,以确保链表的结构正确。在排序和查找过程中,需要考虑不同的算法和复杂度,选择合适的方法来提高效率。

        总的来说,通过实现这些操作,我们可以灵活地对单链表进行操作,实现了对节点的添加、删除、排序和查找等功能。熟练掌握这些操作为我们日后学习哈希表和二叉树,都打下了非常坚实的基础。

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

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

相关文章

8.2 矢量图层点要素单一符号使用一

文章目录 前言单一符号&#xff08;Single symbol&#xff09;渲染简单标记(Simple Marker)QGis代码实现 SVG标记&#xff08;SVG marker&#xff09;QGis代码实现 总结 前言 上一篇教程对矢量图层符号化做了一个整体介绍&#xff0c;并以点图层为例介绍了可以使用的渲染器&am…

c语言进制的转换16进制转换2进制

c语言进制的转换16进制转换2进制 c语言的进制的转换 c语言进制的转换16进制转换2进制一、16进制的介绍二、八四二一法则三、16进制转换2进制 一、16进制的介绍 十六进制&#xff1a; 十六进制逢十六进一&#xff0c;所有的数组是0到9和A到F组成&#xff0c;其中A代表10&#x…

【网络原理】| 应用层协议与传输层协议 (UDP)

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️ 专栏&#xff1a;javaEE初阶 &#x1f397;️ 乾坤未定&#xff0c;你我皆黑马 目录 一、应用层协议二、传输层协议&#xff08;UDP协议&#xff09; 一、应用层协议 应用层是和代码直接相关的一层&#xff0c;决定…

电能计量与远程抄表的应用

摘要&#xff1a;结合当前电力企业实际的发展概况&#xff0c;可知电力活动开展中对于性能可靠的电能计量及远程抄表依赖程度高&#xff0c;需要注重它们实际应用范围的扩大&#xff0c;满足电力企业长期稳定发展的实际需求。基于此&#xff0c;本文将对电能计量与远程抄表应用…

【前端】Webpack5中Html和CSS的压缩打包

1.Webpack5简介 1.1.Webpack简介 &#xff08;1&#xff09;webpack的发展历程 2012.3—webpack&#xff08;问世&#xff09; 2014.2—webpack1 2016.12—webpack2 2017.6—webpack3 2018.2—webpack4 2020.10—webpack5&#xff08;要求node版本10.13&#xff09; &a…

Visual Studio Professional 2019 软件安装教程(附安装包下载)

Microsoft Visual Studio 是一个非常强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;适用于 Windows 上的 .NET 和 C 开发人员。它提供了一系列丰富的工具和功能&#xff0c;可以提升和增强软件开发的每个阶段。 Visual Studio IDE 是一个创意启动板&#xff0c;可…

uniapp中 background-image 设置背景图片不展示问题

有问题 <view class"file-picker__box jsz" tap"jszxszUpload(jsz)"></view>.jsz {background-image: url(../../static/example_drive.png); }解决1 <view class"file-picker__box jsz" :style"{ background-image: url(…

JS小数运算精度丢失的问题

工作中会不会经常会碰到一些数据指标的计算&#xff0c;比如百分比转化&#xff0c;保留几位小数等&#xff0c;就会出现计算不准确&#xff0c;数据精度丢失的情况。通过这篇分享借助第三方库能够轻松解决数据精度丢失的问题。 一、场景复现 JS数字精度丢失的一些常见问题 /…

SpringBoot+SpringMVC+MybatisPlus

文章目录 SpringBootSpringMVCMybatisPlus怎样在SpringBoot中引入SpringMVC?首先看下引入的依赖创建数据库表创建DO类创建MyBatisPlus动态代理接口创建controller控制器接收http请求创建SpringBoot配置文件application.yml最后创建启动类 SpringBootSpringMVCMybatisPlus 怎样…

cuda卸载

去查看你的电脑显卡对应的cuda版本&#xff0c;不然还是一整个用不到gpu的情况嘿嘿. 啊啊啊啊打开控制面板看一下&#xff0c;驱动不要乱卸载&#xff1a; 这些东西不能全部卸载了哦&#xff0c;只能卸载含有“CUDA”的那几个&#xff08;其实其他的可能也没有用 但是不懂的哇 …

关于路由转发

路由表的作用 路由表的作用&#xff1a;目标网络匹配路由表&#xff0c;从相应网络转发&#xff1b;不匹配路由表&#xff0c;丢弃或转发至默认路由器。 路由转发的原理 根据IP地址找到目标网络&#xff0c;由应路由器解封装查看目标网络是否可达&#xff0c;重新封装进行转…

Axure 9 使用 font awesome 字体发布原型

我使用的版本为Font awesome 6.1.1&#xff0c;安装后在axure中新增3个字体 如果直接发布&#xff0c;在没有安装Font awesome的电脑上无法正常显示字体图标&#xff0c;需要在发布前进行设置。 设置方法&#xff1a; 点击共享 点开设置 在字体设置页&#xff0c;填入图中所示…

FreeRTOS 消息队列 详解

目录 什么是队列&#xff1f; 消息队列特点 1. 数据入队出队方式 2. 数据传递方式 3. 多任务访问 4. 出队、入队阻塞 消息队列相关 API 函数 1. 创建队列 2. 写队列 3. 读队列 消息队列实操 什么是队列&#xff1f; 队列又称消息队列&#xff0c;是一种常用于任务间…

创建 Edge 浏览器扩展教程(下)

创建 Edge 浏览器扩展教程&#xff08;下&#xff09; 创建扩展教程&#xff0c;第 2 部分1&#xff1a;更新弹出窗口.html以包含按钮2&#xff1a;更新弹出窗口.html在浏览器选项卡顶部显示图像3&#xff1a;创建弹出式 JavaScript 以发送消息4&#xff1a;从任何浏览器选项卡…

全国三维数字化创新设计大赛湖北赛区省赛成功举办

须弥芥子&#xff0c;数字如海。10月14日—15日&#xff0c;2023 年数字科技文化节——第16届全国三维数字化创新设计大赛湖北赛区省赛暨产教联合体大会在武汉软件工程职业学院成功举行。 &#xff08;大赛全体专家领导合影&#xff09; 全国三维数字化创新设计大赛组委会副秘…

Windows 安装 jmeter

注&#xff1a;在安装Jmeter之前&#xff0c;请先检查下电脑有没有装JDK&#xff1a;开始->运行->然后输入cmd->进入命令行界面&#xff0c;输入java -version &#xff0c; 出现以下信息就是此电脑已安装了JDK&#xff1a; 下载地址 http://jmeter.apache.org/downlo…

C/C++程序设计和预处理

个人主页&#xff1a;仍有未知等待探索_C语言疑难,数据结构,小项目-CSDN博客 专题分栏&#xff1a;C语言疑难_仍有未知等待探索的博客-CSDN博客 目录 一、引言 二、程序的翻译环境和执行环境 1、什么是程序 2、程序的翻译环境 3、程序的执行环境 三、预处理 1、预定义符…

python爬虫分析基于python图书馆书目推荐数据分析与可视化

收藏关注不迷路 文章目录 前言一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、文章目录 前言 随着电子技术的普及和快速发展&#xff0c;线上管理系统被广泛的使用&#xff0c;有很多商业机构都在实现电子信息化管理&#xff0c;图书推荐也不例外&#xff0c…

windows协议详解之-RPC/SMB/LDAP/LSA/SAM域控协议关系

如果你在windows域控环境中&#xff0c;例如企业的网络中开启wireshark抓包&#xff0c;你一定会遇到一大堆各种各样的协议。不同于互联网服务&#xff08;大多基于HTTP&#xff09;&#xff0c;为了实现域控中各种各样的服务&#xff0c;windows的域控环境中采用了非常多的协议…

程桌面管理软件Apple Remote Desktop mac中文介绍说明

Apple Remote Desktop mac是一款远程桌面管理软件。它可以让用户通过局域网或互联网连接到其他远程计算机&#xff0c;并实时监控和管理这些计算机。 使用Apple Remote Desktop&#xff0c;用户可以轻松远程操作和控制其他计算机的桌面。用户可以在远程计算机上查看、操控和键入…