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

重生之“我打数据结构,真的假的?”--2.单链表(无习题)

在这里插入图片描述

C语言中的单链表总结

单链表是一种基础的数据结构,广泛应用于C语言编程中。它由节点组成,每个节点包含数据和指向下一个节点的指针。单链表的优点在于动态内存分配和高效的插入与删除操作。本文将详细探讨单链表的定义、基本操作、应用场景以及相关示例代码。

一、单链表的基本结构

单链表由多个节点组成,每个节点包含两部分:

  • 数据部分:存储实际数据。
  • 指针部分:指向下一个节点的指针。
    在这里插入图片描述

节点的定义

在C语言中,我们可以使用结构体来定义单链表的节点。
在这里插入图片描述

typedef struct Node {int data;               // 数据部分struct Node* next;      // 指向下一个节点的指针
} Node;

二、单链表的基本操作

1. 创建单链表

创建单链表通常需要一个头指针,用于指向链表的第一个节点。若链表为空,头指针为NULL。

Node* createList() {return NULL;  // 返回空链表
}

2. 插入节点

2.1 在头部插入

在链表的头部插入新节点是最简单的操作。我们需要创建一个新节点,并将其指向当前的头节点。

Node* insertAtHead(Node* head, int newData) {Node* newNode = (Node*)malloc(sizeof(Node)); // 动态分配内存newNode->data = newData;    // 设置新节点的数据newNode->next = head;       // 新节点指向原头节点return newNode;             // 返回新的头节点
}
2.2 在尾部插入

在尾部插入节点需要遍历链表找到最后一个节点,然后将其指针指向新节点。

Node* insertAtTail(Node* head, int newData) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = newData;newNode->next = NULL; // 新节点的下一个指针为NULLif (head == NULL) {return newNode; // 如果链表为空,返回新节点}Node* temp = head;while (temp->next != NULL) {temp = temp->next; // 遍历到最后一个节点}temp->next = newNode; // 将最后一个节点的next指针指向新节点return head;
}

3. 删除节点

删除节点通常需要指定要删除的节点值,遍历链表找到该节点并进行删除。

Node* deleteNode(Node* head, int key) {Node* temp = head;Node* prev = NULL;// 如果头节点包含要删除的值if (temp != NULL && temp->data == key) {head = temp->next; // 更新头节点free(temp);        // 释放内存return head;}// 遍历链表查找要删除的节点while (temp != NULL && temp->data != key) {prev = temp;temp = temp->next;}// 如果未找到要删除的节点if (temp == NULL) {return head;}// 解除节点的链接并释放内存prev->next = temp->next;free(temp);return head;
}

4. 查找节点

查找节点根据值查找节点的位置。

Node* search(Node* head, int key) {Node* current = head;while (current != NULL) {if (current->data == key) {return current; // 返回找到的节点}current = current->next; // 继续遍历}return NULL; // 未找到
}

5. 遍历链表

遍历链表通常用于显示链表中的所有数据。

void traverseList(Node* head) {Node* temp = head;while (temp != NULL) {printf("%d -> ", temp->data);temp = temp->next;}printf("NULL\n"); // 显示链表结束
}

6. 反转链表

反转链表操作是将链表的指向反转,使最后一个节点变为第一个节点。

Node* reverseList(Node* head) {Node* prev = NULL;Node* current = head;Node* next = NULL;while (current != NULL) {next = current->next; // 保存下一个节点current->next = prev; // 反转指针prev = current;       // 移动prev和currentcurrent = next;}return prev; // 返回新的头节点
}

三、单链表的应用

单链表在许多场景中都有应用,包括:

  1. 动态数据存储:当数据量不固定时,链表能有效利用内存。
  2. 实现栈和队列:单链表可以轻松实现栈和队列的操作。
  3. 缓存管理:可以用于实现LRU缓存。
  4. 图的邻接表表示:链表可以表示图中节点之间的连接关系。

在这里插入图片描述

四、完整示例

下面是一个完整的单链表示例,演示了所有基本操作。

#include <stdio.h>
#include <stdlib.h>typedef struct Node {int data;struct Node* next;
} Node;Node* createList() {return NULL;
}Node* insertAtHead(Node* head, int newData) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = newData;newNode->next = head;return newNode;
}Node* insertAtTail(Node* head, int newData) {Node* newNode = (Node*)malloc(sizeof(Node));newNode->data = newData;newNode->next = NULL;if (head == NULL) {return newNode;}Node* temp = head;while (temp->next != NULL) {temp = temp->next;}temp->next = newNode;return head;
}Node* deleteNode(Node* head, int key) {Node* temp = head;Node* prev = NULL;if (temp != NULL && temp->data == key) {head = temp->next;free(temp);return head;}while (temp != NULL && temp->data != key) {prev = temp;temp = temp->next;}if (temp == NULL) {return head;}prev->next = temp->next;free(temp);return head;
}Node* search(Node* head, int key) {Node* current = head;while (current != NULL) {if (current->data == key) {return current;}current = current->next;}return NULL;
}void traverseList(Node* head) {Node* temp = head;while (temp != NULL) {printf("%d -> ", temp->data);temp = temp->next;}printf("NULL\n");
}Node* reverseList(Node* head) {Node* prev = NULL;Node* current = head;Node* next = NULL;while (current != NULL) {next = current->next;current->next = prev;prev = current;current = next;}return prev;
}int main() {Node* head = createList();head = insertAtHead(head, 1);head = insertAtTail(head, 2);head = insertAtTail(head, 3);head = insertAtHead(head, 0);printf("Current List: ");traverseList(head);head = deleteNode(head, 2);printf("After Deleting 2: ");traverseList(head);Node* foundNode = search(head, 1);if (foundNode) {printf("Found Node with data: %d\n", foundNode->data);} else {printf("Node not found.\n");}head = reverseList(head);printf("Reversed List: ");traverseList(head);return 0;
}

五、总结

单链表是一种灵活且实用的数据结构,通过动态内存分配和简单的插入、删除操作,使得它在许多实际应用中都能发挥重要作用。掌握单链表的基本操作,为深入学习其他数据结构奠定了基础。希望本总结对理解和使用单链表有所帮助。

小习题:

习题1

习题2

习题3

相关文章:

重生之“我打数据结构,真的假的?”--2.单链表(无习题)

C语言中的单链表总结 单链表是一种基础的数据结构&#xff0c;广泛应用于C语言编程中。它由节点组成&#xff0c;每个节点包含数据和指向下一个节点的指针。单链表的优点在于动态内存分配和高效的插入与删除操作。本文将详细探讨单链表的定义、基本操作、应用场景以及相关示例…...

【有啥问啥】视频插帧算法技术原理详解

视频插帧算法技术原理详解 引言 视频插帧&#xff08;Video Interpolation&#xff09;技术&#xff0c;作为计算机视觉领域的一项重要应用&#xff0c;旨在通过算法手段在已有的视频帧之间插入额外的帧&#xff0c;从而提升视频的帧率&#xff0c;使其看起来更加流畅。这一技…...

Leetcode148,109以及二者的合并 -> Tencent面试算法题 - 无序双向链表转BST

根源简述 这道题是腾讯在2024/8/30考的一道面试题&#xff0c;整体来说&#xff0c;难度不大&#xff0c;就是代码量稍稍有点儿大&#xff0c;让我们一起来看一下吧 题目描述 整数无序双向链表能否转BST&#xff08;二叉搜索树&#xff09;&#xff0c;如果能&#xff0c;怎么转…...

【蓝桥杯选拔赛真题77】python计算小球 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析

目录 python计算小球 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python计算小球 第十五届蓝桥杯青少年组python比赛选拔赛真题 一、题目要…...

获取Hive表备注

DESCRIBE EXTENDED 表名;先获取Detailed Table Information这行的data_type字段数据&#xff0c;进行正则匹配&#xff0c;拿到表备注&#xff0c;如下&#xff1a; String str ReUtil.get("parameters:\\{(?!.*?\\().*transient_lastDdlTime.*?comment(.*?)\\}&quo…...

10.30学习

一、科学计数法 C语言中的科学计数法主要用于表示非常大或非常小的浮点数&#xff0c;它遵循以下格式&#xff1a; 1. E或e表示指数&#xff1a; 科学计数法中的E或e用来表示“指数”&#xff08;Exponent&#xff09;。例如&#xff0c; 1.23e4 或 1.23E4 表示 1.23 * 10^4…...

什么是栈溢出

一、什么是栈溢出 栈溢出&#xff08;Stack Overflow&#xff09;就是指在程序运行过程中&#xff0c;往栈里存放的数据超过了栈所能容纳的最大容量&#xff0c;从而导致程序出现异常行为的情况。这就好比一个箱子本来只能装一定数量的物品&#xff0c;硬要往里面塞更多的东西&…...

在linux中arm-linux-gcc和/usr/bin/gcc有啥区别

在Linux中&#xff0c;arm-linux-gcc和/usr/bin/gcc都是编译器&#xff0c;但它们之间存在显著的区别&#xff0c;主要体现在编译目标、使用场景以及编译生成的二进制文件的可执行性上。而软链接则是Linux文件系统中的一种特殊文件类型&#xff0c;用于创建一个文件的别名。 a…...

常用环境部署(二十二)——MySQL的数据库迁移到另一个机器上

1、导出原数据库的数据 mysqldump -u [用户名] -p[密码] [数据库名] > database_dump.sql 命令示例&#xff1a; mysqldump -u root -p123456 wd > /opt/wd.sql 2、在新机器上创建数据库 mysql -u [用户名] -p -e "CREATE DATABASE [新数据库名]" 命令示…...

两台主机只能单方向ping通

可能性比较大的原因时ping不通的那台主机安装了个人防火墙。 在共享上网的机器中&#xff0c;出于安全考虑&#xff0c;大部分主机都安装个人防火墙软件。几乎所有个人防火墙软件默认不允许其他机器ping本机。一般的做法是将来自外部的ICMP请求报文滤掉&#xff0c;对本机出去的…...

redis windows 5.0 下载

Redis 简介 Redis 是一个高性能的 key-value 数据库&#xff0c;广泛应用于缓存、消息队列、实时分析等场景。它支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等&#xff0c;并且提供了丰富的操作命令&#xff0c;能够满足各种复杂的数据处理需求。 下载…...

视频转gif怎么转换?6种视频格式转换简单方法分享,附操作截图!

gif动图凭借其简洁而生动的特点&#xff0c;已成为互联网交流中不可或缺的一部分。尽管gif和视频在技术上有所不同&#xff0c;但两者都能以短小的帧展现动作&#xff0c;而gif通常不带声音&#xff0c;具备循环播放的特性。因此&#xff0c;出于创建gif动图、存储更多媒体文件…...

StructRAG简介

StructRAG是一种新型的框架&#xff0c;旨在提升大型语言模型&#xff08;LLMs&#xff09;在知识密集型推理任务中的性能。它通过推理时的混合信息结构化机制&#xff0c;根据任务需求以最合适的格式构建和利用结构化知识。 以下是StructRAG的核心组成部分和工作流程&#xff…...

java脚手架系列12-mongoDB

之所以想写这一系列&#xff0c;是因为之前工作过程中有几次项目是从零开始搭建的&#xff0c;而且项目涉及的内容还不少。在这过程中&#xff0c;遇到了很多棘手的非业务问题&#xff0c;在不断实践过程中慢慢积累出一些基本的实践经验&#xff0c;认为这些与业务无关的基本的…...

python四舍五入保留两位小数

在 Python 中&#xff0c;你可以使用内置的 round() 函数来对数字进行四舍五入并保留两位小数。round() 函数有两个参数&#xff1a;要四舍五入的数字和要保留的小数位数。以下是一个简单的示例&#xff1a; # 示例数字 number 3.14159# 四舍五入保留两位小数 rounded_number…...

期权懂|有什么期权交易策略能够稳赚不赔的?

期权小懂小编每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 有什么期权交易策略能够稳赚不赔的? 期权交易具有风险性&#xff0c;没有任何一种策略能够保证稳赚不赔。 以下是一些常见的期权交易策略&#xff0c;虽不能保证盈利&#…...

笔记本脱机状态

先是显示脱机&#xff0c;请尝试其他方法登录 1.按照联想客服&#xff0c;进入高级选项里面&#xff0c;清除两个更新项目&#xff0c;没有卸载成功 2.安装wepe&#xff0c;先是能检测到U盘&#xff0c;但是进不去&#xff0c;然后我淘宝淘帮我做盘&#xff0c;我自己重新装了一…...

Node.js:模块 包

Node.js&#xff1a;模块 & 包 模块module对象 包npm安装包配置文件镜像源 分类 模块 模块化是指解决一个复杂问题时&#xff0c;自顶向下逐层把系统划分成若干模块的过程。对于整个系统来说&#xff0c;模块是可组合、分解和更换的单元。 简单来说&#xff0c;就是把一个…...

油动无人机动力测试台-60公斤级-Flight Stand 60 ICE

产品简介 通过Flight Stand 60 ICE测试台对内燃机和螺旋桨的拉力&#xff0c;扭矩&#xff0c;转速&#xff0c;燃油流量&#xff0c;温度&#xff0c;功率和螺旋桨效率的测量&#xff0c;帮助用户精准地描述和评估其性能参数&#xff0c;以不断地优化和提升燃油动力系统性能。…...

给grasshopper中的python脚本电池加个标签

ghenv.Component.Message test使用python脚本创建的电池&#xff0c;也可以保存起来。 File – Create User Object...

别被忽悠了 Lua 数组真的也可以从 0 开始索引?

先前我说 Lua 数组从 1 开始不太爽&#xff0c;很多人来纠正我说也可以从 0 开始&#xff0c;比如&#xff1a; local m { [0] 100, 101, 102, 103 }然后访问时 m[0] 也可以正常访问到第 0 个元素&#xff0c;所以 “Lua 给你充分自由度&#xff0c;让你可以从任意下标索引数…...

docker占用磁盘过多问题

我在windows系统上用docker&#xff0c;安装在C盘环境下&#xff0c;我发现C盘占用了大量的空间&#xff0c;查找后发现是docker的映像文件占用的&#xff0c;于是开始清理&#xff0c;中间还踩个坑&#xff0c;记录一下&#xff0c;下次需要的时候方便找。 踩坑 我本想移动映…...

[实时计算flink]使用Python依赖

您可以在Flink Python作业中使用自定义的Python虚拟环境、第三方Python包、JAR包和数据文件等&#xff0c;本文为您介绍如何在Python作业中使用这些依赖。 使用自定义的Python虚拟环境 说明 VVR 4.x仅支持3.7版本的Python虚拟环境&#xff0c;VVR 6.x及以上的版本无此限制&a…...

MySql如何实现分布式锁

本篇我们使用mysql实现一个分布式锁。 环境&#xff1a;mysql8,navicat,maven,springboot2.3.11,mybatis-plus 分布式锁的功能 1,分布式锁使用者位于不同的机器中&#xff0c;锁获取成功之后&#xff0c;才可以对共享资源进行操作 2,锁具有重入的功能&#xff1a;即一个使用…...

「行内揭秘」 SQLynx数据库界的“小众宝藏”?

数据库界的“小众宝藏”&#xff1f;Navicat老大哥地位稳如泰山&#xff0c;但这位“SQLynx”小弟也不容小觑&#xff01;&#x1f440; 别看它小众&#xff0c;SQLynx在处理数据库事务上那可是丝毫不含糊&#xff0c;无论你是Windows Linux和Mac&#xff0c;甚至银河麒麟统信都…...

【已解决】【MySQL】IDEA配置数据库 报错 未配置SQL方言 无法使用SQL提示

IDEA配置数据库的步骤 下载插件 添加数据源 新建--->选择数据源MySQL 页面展示&#xff1a; 主机名&#xff1a;一般都是localhost不用改端口&#xff1a;填写自己的端口号用户&#xff1a;填写自己的用户名密码&#xff1a;填写自己设置的密码数据库&#xff1a;填写需要…...

js 通过filter 实现扁平化数据tree

...

Android 开发 调节声音 SeekBar自定义样式

效果图 xml布局 mipmap/seekbar图片随意一张图都可以&#xff0c;这里我的图就不贴出来了 <SeekBarandroid:id"id/seekBar"android:layout_marginLeft"8dp"android:layout_width"377dp"android:layout_height"8dp"android:layou…...

UART-通用异步收发器

1. UART的基本工作原理 UART通信主要有两个部分构成&#xff1a;发送器和接收器&#xff0c;也就是我们常见的&#xff08;RX接收&#xff0c;TX发送&#xff09;两个独立的线路来实现数据的双向传输&#xff0c;由于是异步的&#xff0c;UART并不需要时钟信号&#xff0c;而是…...

Linux——— 信号

文章目录 前言&#xff1a;引入信号生活中的例子信号概念见一见Linux中的信号 浅度理解信号信号处理&#xff08;浅谈&#xff09;:如何自定义捕捉 信号保存&#xff08;浅谈&#xff09; 信号产生系统调用产生异常产生&#xff1a;浅谈除0异常浅谈解引用野指针异常Core &&…...

网站怎么做qq授权登录/国家高新技术企业名单

作为一个读书爱好者&#xff0c;和一个豆瓣狂热支持者&#xff0c;前段时间对豆瓣的开放API很感兴趣。在写“使用正则表达式获取豆瓣评论全文之研究”这篇文章的时候&#xff0c;就萌生了自己写一个方便查询书籍信息的豆瓣WP7客户端应用。快两个月过去了&#xff0c;梦想一步步…...

怎么看网站是什么语言做的后台/长沙关键词优化公司电话

作者&#xff1a;Mazin https://my.oschina.net/u/3441184/blog/893628 这样的情景可能不常见&#xff0c;但是还是会有的&#xff0c;一旦遇到&#xff0c;如果业务比较复杂&#xff0c;就会很麻烦&#xff0c;但是还是有解决的方案的&#xff0c;比如将一个service方法拆成两…...

网站制作需求文档/seo搜索引擎优化推广

01常量和变量 1、常量&#xff1a;在程序运行过程中&#xff0c;其值不能被改变的量称为常量。分为以下几类&#xff1a;&#xff08;1&#xff09;整型常量&#xff08;2&#xff09;实型常量&#xff08;3&#xff09;字符常量①普通字符②转义字符&#xff08;4&#xff09;…...

吉林省建设工程造价网站/推广方案如何写

前驱节点&#xff08;predecessor&#xff09; 前驱节点&#xff1a;中序遍历时的前一个节点。如果是二叉搜索树&#xff0c;前驱节点就是前一个比它小的节点。 node.left ! null 举例&#xff1a;6、13、8predecessor node.left.right.right.right...&#xff0c;终止条件&a…...

做健身推广网站/域名查询 站长查询

1.安装&#xff1a; 首先找到git的官网&#xff0c;内部有下载链接。 也可以用下面的&#xff0c;我的是win7的64位系统&#xff1a; 可以在此处下载&#xff1a;Git-2.13.0-64-bit.exe链接&#xff1a;http://pan.baidu.com/s/1dFIOU1V 密码&#xff1a;xky2 下面是安装后的效…...

网站制作建设是做什么/十大骗子教育培训机构

文章目录 前言I 使用catchTouchPoint 函数实现点坐标的获取II 使用iOS API获取在屏幕上的点击坐标2.1 创建`UIApplication` 子类,实现`sendEvent:`获取在屏幕上的点击坐标2.2 在main方法添加principalClassNamesee also前言 获取屏幕坐标的方式: LUA 函数touchDown(idx, x, …...