【数据结构与算法】深入浅出:单链表的实现和应用

 

🌱博客主页:青竹雾色间.

😘博客制作不易欢迎各位👍点赞+⭐收藏+➕关注

 ✨人生如寄,多忧何为 

目录

前言

单链表的基本概念

节点

头节点

尾节点

单链表的基本操作

创建单链表

头插法:

尾插法:

插入(增)操作

 删除(删)操作:

查找(查)操作:

修改(改)操作:

遍历链表

单链表的应用场景


前言

在本篇博客中,我们将深入探索一种常见的数据结构——单链表。单链表是一种线性数据结构,它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。单链表的特点是插入和删除操作非常简单,但是查找和遍历操作可能会比较耗时。我们将学习单链表的基本概念、操作以及实现方式。

单链表的基本概念

下面我们来介绍一下单链表的基本概念和操作。

  • 节点

单链表中的每个节点都包含两个部分:数据域(DATA)和指针域(NEXT)。

数据域用于存储数据元素可以是数组,可以是int,甚至可以是结构体,

指针域用于存储指向下一个节点的指针

typedef int ElemType; //定义单链表结构
typedef struct Node{ElemType data;//数据域struct Node *next;//指针域
} LinkList;//初始化
  • 头节点

单链表的第一个节点称为头节点,它不包含任何数据元素,只包含一个指向第一个节点的指针。在单链表中,头节点通常被定义为全局变量或者静态变量。

//创建头结点,并将数据存入头结点中
LinkList CreateList(ElemType n){LinkList head = (LinkList)malloc(sizeof(struct Node));head->data = n;head->next = NULL;return head;
}
  • 尾节点

单链表的最后一个节点称为尾节点,它也不包含任何数据元素,只包含一个指向最后一个节点的指针。在单链表中,尾节点通常被定义为全局变量或者静态变量。

链表的尾节点NEXT指向NULL(空),因为尾部没有任何可以指向的空间了.

单链表的基本操作

单链表是一种常见的数据结构,支持以下四种基本操作:插入(增)、删除(删)、查找(查)、修改(改)。下面将逐一介绍这些操作的实现方法。

创建单链表

头插法:

我们首先创建一个头结点,然后将新节点插入到头结点的后面。具体实现时,我们可以使用指针来遍历链表,找到最后一个节点,然后将新节点插入到该节点的后面。这样就可以保证新节点始终位于链表的头部。

// 头插法
Node* insertAtHead(Node *head, int data) {Node *newNode = (Node*)malloc(sizeof(struct Node));newNode->data = data;newNode->next = head;return newNode;
}

尾插法:

我们首先创建一个头结点,然后将新节点插入到头结点的后面。具体实现时,我们可以使用指针来遍历链表,找到最后一个节点,然后将新节点插入到该节点的后面。这样就可以保证新节点始终位于链表的尾部。

// 尾插法
Node* insertAtTail(Node *head, int data) {Node *newNode = (Node*)malloc(sizeof(struct Node));newNode->data = data;if (head == NULL) { // 如果链表为空,则直接将新节点作为头结点。newNode->next = NULL;return newNode;} else if (head->next == NULL) { // 如果链表只有一个元素,则直接将新节点插入到该元素后面。head->next = newNode;return head;} else { // 否则,找到最后一个节点,然后将新节点插入到该节点的后面。Node *temp = head;while (temp->next != NULL) temp = temp->next;temp->next = newNode;return head;}
}

  • 插入(增)操作

          在单链表中插入一个新节点,将其链接到链表中的其他节点。

// 在指定位置插入一个新节点
void insertAtPos(Node** head, int pos, ElemType e) {Node* p = *head;int i = 1; // i表示当前节点的位置,从第二个节点开始计算while (i < pos && p != NULL) p = p->next, i++; // 从第二个节点开始遍历到指定位置的前一个节点Node* newNode = (Node*)malloc(sizeof(struct Node));if (newNode == NULL) exit(0); // 如果分配失败则退出程序newNode->data = e; // 将新节点的数据域设置为eif (p == NULL) *head = newNode; // 如果指定位置的前一个节点是空的,则将新节点作为新的头结点else newNode->next = p->next; // 否则将新节点插入到指定位置的前一个节点后面p->next = newNode; // 将新节点插入到链表中
}

  •  删除(删)操作

         从单链表中删除一个节点,重新连接链表中的其他节点。

  1. 若要删除的节点为头节点,直接将头节点指向下一个节点即可。
  2. 若要删除的节点不是头节点,遍历链表找到该节点的前一个节点。
  3. 将前一个节点的next指针指向要删除节点的下一个节点。

 

  • 查找(查)操作

        在单链表中查找特定的元素。

  1. 从头节点开始遍历链表,逐个比较节点的数据与目标数据是否相等。
  2. 若找到相等的节点,则返回该节点或其他需要的信息。
  3. 若遍历完整个链表仍未找到目标数据,则表示目标数据不存在于链表中。
//在单链表中查找值为x的结点
int Locate(LinkList L, int x)
{LinkList p;int j = 1;p = L->next;while (p != NULL && p->data != x){p = p->next;j++;}if (p){printf("%d在链表中,是第%d个元素", p->data - 48, j);//由于是ASCII,所以-48}else{printf("该数值不在链表里。\n");return 0;}
}

//求单链表的长度
int ListLength(LinkList L)
{Node* p;p = L->next;int j = 0;//计数器jwhile (p != NULL){p = p->next;j++;}printf("%d", j);return 0;
}
  • 修改(改)操作

        更新单链表中节点的数据。

  1. 从头节点开始遍历链表,逐个比较节点的数据与目标数据是否相等。
  2. 若找到相等的节点,则将该节点的数据更新为新的数据。
//链表内容的修改,在链表中修改值为x的元素变为为k。
LinkedList LinkedListReplace(LinkedList L,int x,int k) {Node *p=L->next;int i=0;while(p){if(p->data==x){p->data=k;}p=p->next;}return L;
}
  • 遍历链表

在单链表中,遍历链表的操作可以通过以下步骤实现:

a. 从头结点开始遍历链表;

b. 对于每个节点,执行相应的操作(如打印数据元素)。

void Print(LinkList L) 
{Node* p = L->next;while (p) {printf("%c ", p->data);p = p->next;}
}

单链表的应用场景

单链表在实际的软件开发中有广泛的应用,例如:

  • 数据库系统中的链表索引。

  • 实现栈和队列等其他数据结构。
  • 图算法中的邻接表表示。

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

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

相关文章

【数据结构】 简单认识包装类与泛型

文章目录 包装类基本数据类型和对应的包装类拆箱和装箱自动装箱和自动拆箱包装类面试题 什么是泛型为什么要使用泛型泛型类的创建语法泛型类的使用语法示例类型推导(Type Inference) 裸类型(Raw Type)泛型如何编译的擦除机制为什么不能实例化泛型类型数组 泛型的上界语法示例复…

【C语言】Leetcode 876. 链表的中间节点

主页&#xff1a;17_Kevin-CSDN博客 专栏&#xff1a;《Leetcode》 题目 通过题目的要求可以判断出有两种示例要解决&#xff0c;一种是偶数节点的链表&#xff0c;一种是奇数节点的链表&#xff0c;应对这两种情况我们需要使程序对二者都可以兼容。 解决思路 struct ListNode…

03. Nginx入门-Nginx虚拟主机

Nginx虚拟主机简介 yum安装与源码安装一样&#xff0c;只是Nginx配置文件路径不一致&#xff0c;这里用的yum安装的配置文件路径。 利用虚拟主机的功能&#xff0c;可以在一台Nginx服务器上部署一个或多个虚拟主机。 虚拟主机主配置文件 注意&#xff1a;配置完成Nginx主配置…

时间序列数据平稳性检验与随机性分析

1、实验内容: 分析1964年到1999年中国纱产量的时间序列&#xff0c;主要内容包括: (1)、通过图分析时间序列的平稳性&#xff0c;这个方法很直观&#xff0c;但比较粗糙; (2)、通过计算序列的自相关和偏自相关系数&#xff0c;绘出自相关图&#xff0c;根据平稳时间序列的性质分…

splay学习笔记重制版

以前写的学习笔记&#xff1a;传送门 但是之前写的比较杂乱&#xff0c;这里重制一下 问题背景 假设我们要维护一个数据结构&#xff0c;支持插入、删除、查询某个值的排名&#xff0c;查询第 k k k大的值等操作。 最直接的想法是用二叉搜索树&#xff0c;也就是左子树权值&l…

Java实现手机库存管理

一、实验任务 编写一个程序&#xff0c;模拟库存管理系统。该系统主要包括系统首页、商品入库、商品显示和删除商品功能。每个功能的具体要求如下&#xff1a; 1.系统的首页&#xff1a;用于显示系统所有的操作&#xff0c;并且可以选择使用某一个功能。 2.商品入库功能&…

《JAVA与模式》之访问者模式

系列文章目录 文章目录 系列文章目录前言一、分派的概念二、分派的类型三、访问者模式的结构四、访问者模式的优点五、访问者模式的缺点 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网…

ACWing: 730.机器人跳跃问题

二分、递推 #include <iostream> #include <cstring> #include <algorithm> using namespace std;const int N 1e5 10; int h[N] {0};int n,maxh0; // 当 E > maxh 时一定可以满足bool check(int mid){int E mid;for(int i 1;i < n;i){E 2 *…

电商直播大屏是什么?想搞这个怎么做?

随着电商行业的快速发展&#xff0c;直播带货已成为当下最热门的市场营销方式之一。为了更好地掌握直播数据&#xff0c;为企业决策提供有力支持&#xff0c;电商直播数据大屏应运而生。 一、电商直播数据大屏概述 电商直播数据大屏是一种集成了多种数据源的大屏幕可视化展示…

【管理咨询宝藏资料33】某头部咨询公司组织效能提升模型方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏资料33】某头部咨询公司组织效能提升模型方案 【关键词】战略规划、组织效能、管理咨询 【文件核心观点】 - 通过长期行业积累和市场洞察&#…

四电极测脂模块CSU18M91开发脂肪秤方案

一台脂肪秤通过测试体重、体脂、BMI、水分等数据并给出相应提示&#xff0c;并且许多人都将体脂检测数据作为身体健康指数衡量标准&#xff0c;辅助用户来关注身体健康&#xff0c;同时可以通过蓝牙与手机APP应用相连&#xff0c;记录日常身体变化情况&#xff0c;根据变化情况…

表单验证、属性绑定(一个属性根据另一个属性有无进行操作)

表单验证 一个属性根据另一个属性有无进行操作&#xff08;属性绑定&#xff09; 1、问题描述 ​ 需求&#xff1a;表单里面后两个属性需要根据前面一个属性进行有无判断。如果前面属性没有输入值&#xff0c;则不需要进行操作&#xff1b;如果前面属性有输入值&#xff0c;则…

通过scp在两台设备之间传输文件的sh脚本

前言 因项目需要&#xff0c;需要在两台设备发送大的文件&#xff0c;使用了Libcurl和libssh 和 libsftp等库&#xff0c;发现各种文件&#xff0c;连官方的demo都有文件&#xff0c;于是想到干脆写脚本还简单一些。 环境安装&#xff1a; sudo apt-get install expect 发送&a…

Windows如何安装docker-desktop

下载 docker-desktop设置环境安装wsl可能遇到的错误 下载 docker-desktop 下载官网&#xff1a;https://www.docker.com/products/docker-desktop/ 设置环境 如果没有Hyper-V选项的,按照以下步骤 添加一个文件Hyper-V.bat 添加以下内容,并双击运行后重启电脑 pushd "%~…

喜讯!聚铭网络实力入选「网安新兴赛道厂商速查指南」11大细分赛道

近日&#xff0c;国内首家专业聚焦网络安全商业市场研究分析和加速服务的机构——斯元商业咨询正式发布2024「网安新兴赛道厂商速查指南Emerging Technology Vendor Index」。 聚铭网络凭借在网络安全领域的深厚技术积累、丰富的行业应用经验和良好的客户口碑&#xff0c;成功…

大唐杯学习笔记:Day4

1.1NR帧结构 5G NR中,依然采用一帧10ms,并将一帧分为10子帧,每个子帧为1ms。每个子帧包含几个时隙(slot),每个时隙由14个OFDM符号构成(在常规CP下)。 μ \mu μ Δ f 2 μ ∗ 15 [ K H Z ] \Delta f2^{\mu}*15[KHZ] Δf2μ∗15[KHZ]Cyclic prefix015Normal130Normal260Normal…

运维随录实战(2)之k8s部署应用

一, 创建.gitlab-ci.yml文件 架构流程 文件内容 stages: #设置流水线模版- build # 编译- source2img- deploy # 发布variables: # 设置全局变量MAVEN_PATH: .m2MAVEM_IMAGE: maven:3.8.5-openjdk-17-slim # maven 打包使用的镜像MAVEN_CLI_OPTS: "-s $MAVEN_PATH/set…

红帆OA 多处 SQL注入漏洞复现

0x01 产品简介 红帆iOffice.net从最早满足医院行政办公需求(传统OA),到目前融合了卫生主管部门的管理规范和众多行业特色应用,是目前唯一定位于解决医院综合业务管理的软件,是最符合医院行业特点的医院综合业务管理平台,是成功案例最多的医院综合业务管理软件。 0x02 漏…

java中开源json处理库介绍

在Java生态系统中&#xff0c;有几个常用的开源库用于处理JSON数据。这些库各有特点&#xff0c;适用于不同的场景。下面我将介绍几个流行的Java JSON处理库&#xff0c;包括它们的基本情况、主要特点和核心API。 Jackson 基本情况 Jackson是一个流行的Java库&…

【李沐论文精读】Transformer精读

论文&#xff1a;Attention is All You Need 参考&#xff1a;李沐视频【Transformer论文逐段精读】、Transformer论文逐段精读【论文精读】、李沐视频精读系列 一、摘要 主流的序列转换(sequence transduction)模型都是基于复杂的循环或卷积神经网络&#xff0c;这个模型包含一…