C链表的一些基础知识
一、链表的基本概念
链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针(单链表情况)。通过指针将各个节点连接起来,与数组不同,链表在内存中的存储不是连续的,其优点是可以灵活地进行插入、删除操作,无需像数组那样移动大量元素。
二、单链表的实现
- 定义节点结构体:
// 定义单链表节点结构体
typedef struct ListNode {int data; // 数据域,这里以整型数据为例,可根据需求修改类型struct ListNode *next; // 指针域,指向下一个节点
} ListNode;
- 创建链表节点函数:
// 创建一个新的链表节点
ListNode *createNode(int value) {ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));if (newNode == NULL) {printf("内存分配失败!\n");return NULL;}newNode->data = value;newNode->next = NULL;return newNode;
}
- 插入节点(尾插法为例):
// 尾插法向链表插入节点
void insertTail(ListNode **head, int value) {ListNode *newNode = createNode(value);if (*head == NULL) {*head = newNode;} else {ListNode *temp = *head;while (temp->next!= NULL) {temp = temp->next;}temp->next = newNode;}
}
- 遍历链表函数:
// 遍历链表并输出节点数据
void traverseList(ListNode *head) {ListNode *current = head;while (current!= NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}
- 释放链表内存函数:
// 释放链表占用的内存
void freeList(ListNode *head) {ListNode *current = head;ListNode *next;while (current!= NULL) {next = current->next;free(current);current = next;}
}
三、双链表的实现
- 定义双链表节点结构体:
// 定义双链表节点结构体
typedef struct DoublyListNode {int data;struct DoublyListNode *prev; // 指向前一个节点的指针struct DoublyListNode *next; // 指向后一个节点的指针
} DoublyListNode;
- 创建双链表节点函数:
// 创建双链表节点
DoublyListNode *createDoublyNode(int value) {DoublyListNode *newNode = (DoublyListNode *)malloc(sizeof(DoublyListNode));if (newNode == NULL) {printf("内存分配失败!\n");return NULL;}newNode->data = value;newNode->prev = NULL;newNode->next = NULL;return newNode;
}
- 插入节点(尾插法为例):
// 尾插法向双链表插入节点
void insertTailDoubly(DoublyListNode **head, int value) {DoublyListNode *newNode = createDoublyNode(value);if (*head == NULL) {*head = newNode;} else {DoublyListNode *temp = *head;while (temp->next!= NULL) {temp = temp->next;}temp->next = newNode;newNode->prev = temp;}
}
- 遍历双链表(正向)函数:
// 正向遍历双链表并输出节点数据
void traverseDoublyListForward(DoublyListNode *head) {DoublyListNode *current = head;while (current!= NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}
- 遍历双链表(反向)函数:
// 反向遍历双链表并输出节点数据
void traverseDoublyListBackward(DoublyListNode *head) {DoublyListNode *current = head;if (current == NULL) return;while (current->next!= NULL) {current = current->next;}while (current!= NULL) {printf("%d ", current->data);current = current->prev;}printf("\n");
}
- 释放双链表内存函数:
// 释放双链表占用的内存
void freeDoublyList(DoublyListNode *head) {DoublyListNode *current = head;DoublyListNode *next;while (current!= NULL) {next = current->next;free(current);current = next;}
}
四、循环链表
- 循环单链表:
循环单链表与普通单链表的区别在于,其最后一个节点的指针不是指向NULL
,而是指向链表的头节点,形成一个环形结构。在实现插入、遍历等操作时,需要注意循环的终止条件有所不同,例如遍历循环单链表时,判断节点是否回到头节点来结束循环。 - 循环双链表:
循环双链表中,头节点的prev
指针指向尾节点,尾节点的next
指针指向头节点,构成双向循环结构。其操作函数在处理边界情况和指针修改时要考虑这种循环特性,比如插入节点时要正确更新节点间的双向指针关系。
五、链表的常用操作及函数总结
- 创建节点:用于生成新的链表节点,分配内存并初始化数据和指针域。
- 插入节点:可以有头插法、尾插法、按位置插入等多种方式,调整链表节点间的指针连接关系来插入新节点。
- 删除节点:根据节点的值或者位置等条件,找到要删除的节点,并妥善处理其前后节点的指针连接,释放对应节点内存。
- 遍历链表:按顺序访问链表中的每个节点,输出节点数据或者进行其他需要逐个节点处理的操作,单链表通常是单向遍历,双链表可实现双向遍历。
- 查找节点:依据给定的条件(如节点值等)在链表中查找满足条件的节点,返回节点指针或者相关索引等信息。
六、链表的应用场景
- 动态数据存储:当需要频繁地插入、删除元素,且元素数量不确定时,链表比数组更合适,比如实现一个简单的任务队列管理系统。
- 多项式表示与运算:可以用链表来存储多项式的各项系数和指数,方便进行多项式的加法、乘法等运算。
- 操作系统中的进程管理:用于管理进程控制块(PCB)链表,方便对进程进行调度、插入新进程、结束进程等操作。
总之,链表在 C 语言编程中是非常重要的数据结构,熟练掌握其实现和各种操作函数,能帮助更好地解决很多实际编程问题。
相关文章:
C链表的一些基础知识
一、链表的基本概念 链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针(单链表情况)。通过指针将各个节点连接起来,与数组不同,链表在内存中的存储不是连续的…...

JDK长期支持版本(LTS)
https://blogs.oracle.com/java/post/the-arrival-of-java-23 jdk长期支持版本(LTS):JDK 8、11、17、21:...
【超详细】Python datetime(当前日期、时间戳转换、前一天日期等)【附:时区原理详解】
文章目录 相关文献当前时间前一天日期、后一天日期东八区(北京)时间时间戳转换datetime -> strstr -> datetimedatetime -> timestamp(时间戳)timestamp -> datetime 获取日期中的年、季度、月、周、日、小时、分、秒等时区原理时区问题复杂…...

【Excel】【VBA】双列排序:坐标从Y从大到小排列之后相同Y坐标的行再对X从小到大排列
Excel VBA 双列排序 功能概述 这段VBA代码实现了Excel中的双列排序功能,具体是: 跳过前3行表头先按C列数据从大到小排序在C列值相同的情况下,按B列从大到小排序排序时保持整行数据的完整性 流程图 #mermaid-svg-XJERemQluZlM4K8l {font-fa…...

为什么相关性不是因果关系?人工智能中的因果推理探秘
目录 一、背景 (一)聚焦当下人工智能 (二)基于关联框架的人工智能 (三)基于因果框架的人工智能 二、因果推理的基本理论 (一)因果推理基本范式:因果模型࿰…...
Nginx调优
Nginx 是一个高性能的反向代理服务器和负载均衡器,在处理大量并发请求时表现出色。但是,随着系统负载的增加,Nginx 的性能可能受到多方面的影响,因此进行适当的调优至关重要。以下是 Nginx 调优的几个方向和关键点: 1…...
联德胜w801开发板(四)实现腾讯云mqtt的订阅和发布
一、开发准备 在设备开发这里我们就能看到物模型的topic,跟之前用stm32esp8266一样 附上之前的链接: STM32ESP8266连接腾讯IOT上传数据(四)_stm32通过esp8266上传数据到云平台-CSDN博客https://blog.csdn.net/Try1harder/article/details/134914027?…...

LLM框架对比选择:MaxKB、Dify、FastGPT、RagFlow【RAG+AI工作流+Agent]
1.MaxKB MaxKB Max Knowledge Base,是一款基于 LLM 大语言模型的开源知识库问答系统,旨在成为企业的最强大脑。它能够帮助企业高效地管理知识,并提供智能问答功能。想象一下,你有一个虚拟助手,可以回答各种关于公司内…...

C语言内存之旅:从静态到动态的跨越
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一 动态内存管理的必要性二 动态…...
研1如何准备才能找到大厂实习?
研1如何准备才能找到大厂实习? 写在前面 2024已经走向尾声,迎来了我的2025,这一年我有许多难忘的回忆和经验想要分享给大家,希望对您能有所帮助和启发,希望准备找工作的同学可以少走一些弯路。 我深知目前就业压力大…...

游戏为什么失败?回顾某平庸游戏
1、上周玩了一个老鼠为主角的游戏,某平台喜1送的, 下载了很久而一直没空玩,大约1G,为了清硬盘空间而玩。 也是为了拔掉心中的一根刺,下载了而老是不玩总感觉不舒服。 2、老鼠造型比较写实,看上去就有些讨…...

QT 使用QTableView读取数据库数据,表格分页,跳转,导出,过滤功能
文章目录 效果图概述功能点代码分析导航栏表格更新视图表格导出表格过滤 总结 效果图 概述 本案例用于对数据库中的数据进行显示等其他操作。数据库的映射,插入等功能看此博客框架:数据模型使用QSqlTableModel,视图使用QTableView࿰…...

【前端】CSS学习笔记(1)
目录 CSS的简介CSS的概念语法 CSS的引入方式内联样式(行内样式)内部样式外部样式(推荐) 选择器全局选择器元素选择器类选择器ID选择器合并选择器后代选择器子选择器相邻兄弟选择器通用兄弟选择器伪类选择器:link:visited:hover:ac…...

Ubuntu离线docker compose安装DataEase 2.10.4版本笔记
1、先准备一个可以正常上网的相同版本的Ubuntu系统,可以使用虚拟机。Ubuntu系统需要安装好docker compose或docker-compose 2、下载dataease-online-installer-v2.10.4-ce.tar在线安装包,解压并执行install.sh进行安装和启动 3、导出docker镜像 sudo d…...

C 语言雏启:擘画代码乾坤,谛观编程奥宇之初瞰
大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。* 这一课主要是让大家初步了解C语言,了解我们的开发环境,main函数,库…...
npm操作大全:从入门到精通
引言 在现代前端开发中,npm(Node Package Manager)是不可或缺的工具。无论是安装依赖、管理项目,还是发布自己的包,npm都扮演着重要的角色。本文将带你从npm的基础操作开始,逐步深入到高级用法,…...

AI绘画入门:探索数字艺术新世界(1/10)
引言:AI 绘画的兴起与现状 在科技飞速发展的当下,AI 绘画如同一场艺术领域的风暴,正以惊人的速度席卷而来,彻底改变着我们对艺术创作的认知。近年来,AI 绘画相关的话题屡屡登上热搜,从社交媒体上各种 AI 生…...

Linux应用编程(五)USB应用开发-libusb库
一、基础知识 1. USB接口是什么? USB接口(Universal Serial Bus)是一种通用串行总线,广泛使用的接口标准,主要用于连接计算机与外围设备(如键盘、鼠标、打印机、存储设备等)之间的数据传输和电…...

项目-03-封装echarts组件并使用component动态加载组件
目录 需求场景代码补充说明1. typeComponentMap 讲解2. 为什么要给Echarts实例DOM添加id3. 为什么要在 onMounted 里添加 nextTick4. 为什么要监听props.option 需求 由于需要多次用到echarts,需要封装一个echarts组件动态加载echarts组件 场景代码 场景…...
使用 Blazor 和 Elsa Workflows 作为引擎的工作流系统开发
开发一个完整的工作流系统使用 Blazor 和 Elsa Workflows 作为引擎,可以实现一个功能强大的工作流管理和设计系统。下面将提供详细的步骤和代码实现,展示如何在 Blazor 中开发一个基于 Elsa Workflows 的工作流系统。 项目概述 我们的工作流系统将包含以…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...