当前位置: 首页 > news >正文

单链表基础操作

文章目录

    • abstract
    • 定义结点结构
    • 初始化链表
    • 遍历链表
    • 求表长
    • 查找结点
      • 根据序号查找结点
      • 根据值查找结点
    • 插入结点
      • 首尾位置插入
      • 一般位置插入(通用插入)
      • 找到尾元素|尾指针相关操作
    • 删除结点

abstract

单链表是一种简单的动态数据结构,它由一系列结点组成,每个结点包含一个数据域和一个指向下一个结点的指针。

带头结点的单链表的头结点不存储数据,仅用于指向第一个真正存储数据的结点。

以下是C语言中单链表的一些常用操作:(默认带有头结点)

定义结点结构

另见:链表@单链表相关概念和代码表述-CSDN博客

typedef struct Node
{int data;struct Node *next;
} Node;
typedef Node *LinkList;
//为了提高可读性,利用typedef和Node类型定义一个LinkList类型,效果:ListList L;等价于Node *L;// typedef *Node LinkList;//这种定义是错误的

初始化链表

Node* initList() {Node* head = (Node*)malloc(sizeof(Node));head->next = NULL;return head;
}

遍历链表

遍历链表并打印每个结点的数据:

void printList(Node* head) {Node* p = head->next; // 从首元开始while (p != NULL) {printf("%d -> ", p->data);p = p->next;}printf("NULL\n");
}

求表长

int Length(Node* L){int len=0;//记录链表长度Node *p=L;//p初始化为头指针while(p->next!=NULL){p=p->next;//正式更新p,最后一趟(p->next是尾元,p是倒数第二个结点)p会被此语句更新为尾元len++;//刷新此时p所指结点的位序}//退出循环时,p是尾结点,其后继为NULLreturn len;
}

或者

int Length(Node* L){int len=0;//记录链表长度Node *p=L->next;//p初始化为首元(可能为空)while(p){//最有一次进入循环是p为尾元的情况len++;//刷新此时p所指结点的位序p=p->next;}//离开是p==NULLreturn len;
}

查找结点

分两两种类型:按序号查找和安值查找

根据序号查找结点

Node *getElem(Node*L,int i){Node *p=L;//辅助指针初始化为头指针(头结点指针);int j=0;//指示p指向第几个结点(头结点是第0个结点),从而判断p是否为目标结点可以通用判断j==i来实现while(p!=NULL && j<i){//这种判断条件允许参数i=0;这会返回头结点(而非首元)p=p->next; //p->next从首元开始j++; }//最后一次进入循环是p为尾元或者j=i-1;离开循环时p是尾元的后继NULL,即p==NULL或j==i;如果是NULL说明找不到想要的结点(越界)return p;
}
//这里用不着p指向尾元,所以while条件中用了p!=NULL

根据值查找结点

Node* LocateElem(Node* head, int e) {Node* p = head->next; // 从首元开始while(p!=NULL && p->data!=e){p=p->next;}return p;}
Node* LocateElem(Node* head, int e) {Node* p = head->next; // 从首元开始//判断条件分开写也可以while (p != NULL) {if (p->data == e) return p;p = p->next;}return NULL;
}

插入结点

在带头结点的单链表中,我们可以在任意位置插入一个新结点。

首尾位置插入

// 头插法
void insertAtHead(Node* head, int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = head->next;head->next = newNode;
}// 尾插法
void insertAtTail(Node* head, int data) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;//通过遍历找到最后一个结点,链接新结点Node* p = head;//辅助指针遍历while (p->next != NULL) {p = p->next;}//退出时说明p指向尾结点(非空)//链接尾部新结点p->next = newNode;
}

一般位置插入(通用插入)

找到要插入位置的前驱结点,然后执行插入

#define bool int
#define true 1
#define false 0bool ListInsert(Node*L,int i,ElemType e){Node*p=L;int j=0;//指示当前p所指的结点位序//找到要插入的位置结点的前驱(第i-1)个结点while(p!=NULL && j<i-1){p=p->next;j++;}//离开循环时,若干长度足够,那么是由于j==i-1,否则p==NULL发生越界//检查j的合法性(越界)if(p==NULL){return false;}//新建结点Node *s=(Node*)malloc(sizeof(Node));s->data=e;//插入结点s->next=p->next;p->next=s;return true;
}

找到尾元素|尾指针相关操作

读者可能会考虑以下写法来遍历整个链表

Node* p = head->next;//首元
while (p) {p = p->next;
}//离开循环时p已经是NULL而不是尾结点了,这往往不是我们想要的,尤其是要后续访问或删除尾结点的操作将无法直接利用p进行

因此该写法不利于后续灵活处理,通常把循环语句中的判断语句写成(p->next!=NULL)

或者配合break语句也可以找出最后一个非空结点的指针p

Node* p = head->next;//首元
while (p) {//也可以是while(1)if(p->next==NULL){break;}p = p->next;//可以保证这个赋值内容是非空的
}//退出时说明p指向尾结点(非空)

这种写法虽然也可以,但是简洁和紧凑程度不如下面的做法

 while (p->next != NULL) {p = p->next;
}

删除结点

删除指定位置的结点,可以是根据位置删除或者根据值删除:

若根据位序删除(位序范围 1 ∼ n 1\sim{n} 1n,其中 n n n为链表长度)

根据值删除结点

// 根据值删除结点
void deleteByValue(Node* head, int value) {Node* p = head;while (p->next != NULL && p->next->data != value) {p = p->next;}if (p->next != NULL) {Node* toDelete = p->next;p->next = toDelete->next;free(toDelete);}
}

找到目标结点的前驱,然后执行删除

#define bool int
#define true 1
#define false 0
bool ListDelete(Node *L, int i, ElemType *e)
{Node *p = L;int j = 0;// 找到第i个结点的前驱(第i-1个结点)while (p && j < i - 1){p = p->next;j++;}// 如果此时p是尾结点(后继结点为空,不用删除)或者空指针(没有后继),两种情况都说明i不合法if (p == NULL || p->next == NULL){return false;}Node *q = p->next;*e = q->data; // 返回被删除的值p->next = q->next;//更新后继(断开q结点)free(q);//释放q的内存空间return true;
}

相关文章:

单链表基础操作

文章目录 abstract定义结点结构初始化链表遍历链表求表长查找结点根据序号查找结点根据值查找结点 插入结点首尾位置插入一般位置插入(通用插入)找到尾元素|尾指针相关操作 删除结点 abstract 单链表是一种简单的动态数据结构&#xff0c;它由一系列结点组成&#xff0c;每个结…...

Asp.net MVC在VSCore中的页面的增删改查(以Blog项目为例),用命令代码

在VSCore中的页面的增删改查(以Blog项目为例) 1.创建项目&#xff08;无解决方案&#xff09;复杂项目才需要 dotnet new mvc -o Blog2.控制器 BlogsController.cs 控制器&#xff08;Controller&#xff09;名字和视图&#xff08;View&#xff09;中的文件名要一模一样 u…...

【Leecode】Leecode刷题之路第66天之加一

题目出处 66-加一-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 66-加一-官方解法 方法1&#xff1a;找出最长的后缀9 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&#…...

使用 VLC 在本地搭建流媒体服务器 (详细版)

提示&#xff1a;详细流程 避坑指南 Hi~&#xff01;欢迎来到碧波空间&#xff0c;平时喜欢用博客记录学习的点滴&#xff0c;欢迎大家前来指正&#xff0c;欢迎欢迎~~ ✨✨ 主页&#xff1a;碧波 &#x1f4da; &#x1f4da; 专栏&#xff1a;音视频 目录 借助VLC media pl…...

Ubuntu 常用解压与压缩命令

.zip文件 unzip FileName.zip # 解压 zip DirName.zip DirName # 将DirName本身压缩 zip -r DirName.zip DirName # 压缩&#xff0c;递归处理&#xff0c;将指定目录下的所有文件和子目录一起压缩 zip DirName.zip DirName 行为&#xff1a; 只压缩 DirName 目录本身&#xff…...

【深度学习】四大图像分类网络之AlexNet

AlexNet是由Alex Krizhevsky、Ilya Sutskever&#xff08;均为Hinton的学生&#xff09;和Geoffrey Hinton&#xff08;被誉为”人工智能教父“&#xff0c;首先将反向传播用于多层神经网络&#xff09;在2012年ImageNet图像分类竞赛中提出的一种经典的卷积神经网络。AlexNet在…...

Day1——GitHub项目共同开发

MarkDowm解释 Markdown是一种轻量级标记语言&#xff0c;它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成结构化的HTML代码。Markdown的目的是让文档的编写和阅读变得更加容易&#xff0c;同时也不失HTML的强大功能。以下是Markdown的一些基本概念和用法&a…...

基于PHP的香水销售系统的设计与实现

摘 要 时代科技高速发展的背后&#xff0c;也带动了经济的增加&#xff0c;人们对生活质量的要求也不断提高。香水作为一款在人际交往过程中&#xff0c;给对方留下良好地第一印象的产品&#xff0c;在生活中也可以独自享受其为生活带来的点缀。目前香水市场体量庞大&#xff…...

A-star算法

算法简介 A*&#xff08;A-star&#xff09;算法是一种用于图形搜索和路径规划的启发式搜索算法&#xff0c;它结合了最佳优先搜索&#xff08;Best-First Search&#xff09;和Dijkstra算法的思想&#xff0c;能够有效地寻找从起点到目标点的最短路径。A*算法广泛应用于导航、…...

前端用原生js下载File对象文件,多用于上传附件时,提交之前进行点击预览,或打开本地已经选择待上传的附件列表

用于如上图场景&#xff0c;已经点击选择了将要上传的文件&#xff0c;在附件列表里面用户希望点击下载文件&#xff0c;以核实自己是否选中了需要上传的文件&#xff0c;此刻就需要 用到下面的方法&#xff1a; // 下载File对象文件 downloadByFileObject(file, { fileName }…...

服务器记录所有用户docker操作,监控删除容器/镜像的人

文章目录 使用场景安装auditd添加docker审计规则设置监控日志大小与定期清除查询 Docker 操作日志查看所有用户&#xff0c;所有操作日志查看特定用户的 Docker 操作查看所有用户删除容器/镜像日志过滤特定时间范围内日志 使用场景 多人使用的服务器&#xff0c;使用的docker …...

关于使用天地图、leaflet、ENVI、Vue工具实现 前端地图上覆盖上处理的农业地块图层任务

1.项目框架搭建 项目地址&#xff1a;Webgis: 一个关于webgis、天地图、Leaflet、Vue、数据库的学习框架。 ①git到本地&#xff0c;vscode打开。 ② 配置后端 搜索下载MySQL插件&#xff08;前提&#xff1a;电脑中装有MySQL才可应用&#xff09;。 连接数据库。 配置基本…...

基于yolov4深度学习网络的排队人数统计系统matlab仿真,带GUI界面

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下&#xff08;完整代码运行后无水印&#xff09;&#xff1a; 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 在现代社会…...

用 React 编写一个笔记应用程序

这篇文章会教大家用 React 编写一个笔记应用程序。用户可以创建、编辑、和切换 Markdown 笔记。 1. nanoid nanoid 是一个轻量级和安全的唯一字符串ID生成器&#xff0c;常用于JavaScript环境中生成随机、唯一的字符串ID&#xff0c;如数据库主键、会话ID、文件名等场景。 …...

如何离线安装dockerio

如何离线安装dockerio 一、下载Docker离线安装包二、上传离线安装包三、解压安装包四、复制文件到系统目录五、配置Docker服务六、设置文件权限并重新加载配置七、启动Docker服务八、设置开机自启动九、验证安装Docker是一个开源的容器化平台,用于开发、发布和运行应用程序。离…...

LocalDateTime序列化(跟redis有关)

使用过 没成功&#xff0c;序列化后是[2024 11 10 17 22 20]差不多是这样&#xff0c; 反序列化后就是&#xff1a; [ 2024 11 10.... ] 可能是我漏了什么 这是序列化后的&#xff1a; 反序列化后&#xff1a; 方法&#xff08;加序列化和反序列化注解&#xff09;&…...

【redis】如何跑

在 Windows 上配置 Redis 需要一些额外的步骤&#xff0c;因为 Redis 官方并没有为 Windows 提供原生支持。不过&#xff0c;可以通过以下方法来安装和配置 Redis。 方法一&#xff1a;使用 Windows 版 Redis&#xff08;非官方版本&#xff09; 下载 Redis for Windows Redis…...

Scala学习记录,全文单词统计

package test32 import java.io.PrintWriter import scala.io.Source //知识点 // 字符串.split("分隔符"&#xff1a;把字符串用指定的分隔符&#xff0c;拆分成多个部分&#xff0c;保存在数组中) object test {def main(args: Array[String]): Unit {//从文件1.t…...

【MyBatis】验证多级缓存及 Cache Aside 模式的应用

文章目录 前言1. 多级缓存的概念1.1 CPU 多级缓存1.2 MyBatis 多级缓存 2. MyBatis 本地缓存3. MyBatis 全局缓存3.1 MyBatis 全局缓存过期算法3.2 CacheAside 模式 后记MyBatis 提供了缓存切口&#xff0c; 采用 Redis 会引入什么问题&#xff1f;万一遇到需强一致场景&#x…...

学习ASP.NET Core的身份认证(基于Session的身份认证3)

开源博客项目Blog中提供了另一种访问控制方式&#xff0c;其基于自定义类及函数的特性类控制访问权限。本文学习并测试开源博客项目Blog的访问控制方式&#xff0c;测试程序中直接复用开源博客项目Blog中的相关类及接口定义&#xff0c;并在其上调整判断逻辑。   首先是接口A…...

速盾:高防 CDN 可以配置客户端请求超时配置?

在高防 CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;的运行管理中&#xff0c;客户端请求超时配置是一项重要的功能设定&#xff0c;它对于优化网络资源分配、保障服务质量以及维护系统稳定性有着关键意义。 一、客户端请求超时配置的概念 …...

DRM(数字权限管理技术)防截屏录屏----ffmpeg安装

提示&#xff1a;ffmpeg安装 文章目录 [TOC](文章目录) 前言一、下载二、配置环境变量三、运行ffmpeg四、文档总结 前言 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的…...

使用PyQt5开发一个GUI程序的实例演示

一、安装Python 下载安装到这个目录 G:\Python38-32 安装完成有这些工具&#xff0c;后面备用&#xff1a; G:\Python38-32\Scripts\pyrcc5.exe G:\Python38-32\Scripts\pyuic5.exe 二、PyQt环境配置 pip install PyQt5 pip install pyqt5-tools 建议使用国内源&#xff0c…...

【VUE3】【Naive UI】<NCard> 标签

【Vue3】【Naive UI】 标签 title 属性bordered 属性header-style 和 body-style 属性footer 属性actions 属性hoverable 属性loading 属性size 属性type 属性cover 和 avatar 属性description 属性style 属性 【VUE3】【Naive UI】&#xff1c;NCard&#xff1e; 标签 【VUE3】…...

选择排序之大根堆

大根堆&#xff1a;树的根节点大于左右子树的结点值&#xff0c;这样就能保证每次从树根取的是最大值 灵魂在于HeadAdjust函数&#xff0c;以某节点为树根通过下落调整为大根堆&#xff0c; 建树思想 就是&#xff0c;从最后一个非终端结点开始调整以该结点为根的子树&#x…...

AI的魔力:如何为开源软件注入智慧,开启无限可能

“AI的魔力&#xff1a;如何为开源软件注入智慧&#xff0c;开启无限可能” 引言&#xff1a; 在科技发展的浪潮中&#xff0c;开源软件生态一直扮演着推动创新与共享的重要角色。从Linux到Python&#xff0c;开源项目赋予了开发者全球协作的机会&#xff0c;推动了技术的飞速…...

如何在 VPS 上使用 Git 设置自动部署

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 介绍 要了解 Git 的基本知识以及如何安装&#xff0c;请参考介绍教程。 本文将教你如何在部署应用程序时使用 Git。虽然有许多使用 Gi…...

Linux下的三种 IO 复用

目录 一、Select 1、函数 API 2、使用限制 3、使用 Demo 二、Poll 三、epoll 0、 实现原理 1、函数 API 2、简单代码模板 3、LT/ET 使用过程 &#xff08;1&#xff09;LT 水平触发 &#xff08;2&#xff09;ET边沿触发 4、使用 Demo 四、参考链接 一、Select 在…...

通过 SSH 进行WordPress网站的高级服务器管理

我在管理hostease的服务器时&#xff0c;时常需要通过SSH登录服务器进行修改。而在网站管理中&#xff0c;SSH不仅是一个基础工具&#xff0c;更是高级用户用来精细化管理和优化服务器的重要工具。通过SSH&#xff0c;你可以深入监控服务器的性能、精细管理系统资源&#xff0c…...

速盾高防cdn支持移动端独立缓存

随着移动互联网的快速发展&#xff0c;移动端网页访问量也越来越大。然而&#xff0c;移动端的网络环境相对不稳定&#xff0c;用户体验可能会受到影响。因此&#xff0c;使用高防CDN来加速移动端网页访问&#xff0c;成为越来越多网站运营者的首选。 速盾高防CDN是一种分布式…...

网站建设的误区/台州seo公司

python3中range不返回数组对象&#xff0c;而是返回range对象 所以不能像python2中那样直接返回就是数组 解决&#xff1a; python3中返回一个range函数产生的数组对象&#xff1a; 从我的神经网络模型中截取一段代码 a list(range(layerNum)) # 要的仅仅是定长list结构&am…...

建设银行网页版登录入口/关键词优化公司排行

编译 Linux 固件(GPT)前言本 SDK 开发环境是在 Ubuntu 上开发测试的。我们推荐使用 Ubuntu 16.04 的系统进行编译。其他的 Linux 版本可能需要对软件包做相应调整。 除了系统要求外,还有其他软硬件方面的要求。准备工作硬件要求&#xff1a;64 位系统,硬盘空间大于 40G。如果您…...

西安网站建设开发查派/廊坊seo

程序清单3-7 展示了在构造函数中的隐式的使用this引用溢出 可能造成风险&#xff1a; public class ThisEscape {//新增一个age变量private int age;//注意&#xff1a;一般此时构造函数是public&#xff0c;任何可以访问public ThisEscape(EventSource source) {source.regi…...

网站策划的内容/高质量软文

eslint里的警告消除 在vue控制台界面出现警告时&#xff0c;可以进行手动警告消除 1.点选控制台旁边的输出按钮&#xff0c;找到警告的位置&#xff0c;将灰色括号内的内容复制 2.找到并打开 eslintrc.js 文件 3.将之前复制的灰色内容粘贴到rules&#xff1a;{}中&#xff…...

外贸获客软件排名前十名/甘肃省seo关键词优化

给定一个按照升序排列的整数数组 nums&#xff0c;和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。 你的算法时间复杂度必须是 O(log n) 级别。 如果数组中不存在目标值&#xff0c;返回 [-1, -1]。 示例 1: 输入: nums [5,7,7,8,8,10], target 8 输…...

公司怎么建立网站/百度定位店铺位置怎么设置

先来科普一下&#xff1a; hashcode就是一种算式&#xff0c;然后java把它包装成了方法。 为啥要用hashcode算法来找对象的地址值呢&#xff1f; 如果我有1亿个数据&#xff0c;但我想找其中的一个数据&#xff0c;是不是要找地址值。 hashcode可以将1亿个数据按照一定的规则分…...