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

数据结构入门:单链表详解(从原理到实战,新手必看)

在学习 C 语言数据结构时单链表是绕不开的基础核心。它弥补了数组在插入、删除操作时需要移动大量元素的缺陷是动态内存管理的经典实现。今天我们就从定义、结构到核心操作一步步拆解单链表。一、什么是单链表单链表是一种线性表的链式存储结构它通过指针将多个独立的节点串联起来每个节点包含数据域存储具体数据指针域存储下一个节点的地址和数组相比单链表的优势在于无需预先分配固定大小的内存可动态扩容插入 / 删除操作仅需修改指针时间复杂度为 O (1)已知位置时不需要连续的内存空间内存利用率更高二、单链表的节点结构定义在 C 语言中我们用结构体来定义单链表的节点同时用typedef简化类型名称方便后续操作// 单链表节点结构定义 typedef struct Node{ int data; // 数据域存储节点的数据 struct Node* next; // 指针域指向后继节点 }Node, *List; // Node等价于struct NodeList等价于Node*链表头指针类型三、单链表的核心操作下面我们实现单链表最常用的几个基础操作初始化、头插法创建、尾插法创建、遍历、插入、删除、查找。1. 初始化链表初始化一个空链表即让头指针指向NULL// 初始化链表 void InitList(List* L) { *L NULL; // 空链表头指针指向空 }2. 头插法创建链表将新节点插入到链表头部适合快速构建逆序链表// 头插法在链表头部插入新节点 List HeadInsert(List L, int val) { Node* newNode (Node*)malloc(sizeof(Node)); // 分配新节点内存 newNode-data val; newNode-next L; // 新节点指向原头节点 L newNode; // 头指针更新为新节点 return L; }3. 尾插法创建链表将新节点插入到链表尾部适合构建顺序链表// 尾插法在链表尾部插入新节点 List TailInsert(List L, int val) { Node* newNode (Node*)malloc(sizeof(Node)); newNode-data val; newNode-next NULL; if (L NULL) { // 空链表时新节点就是头节点 return newNode; } Node* p L; while (p-next ! NULL) { // 遍历到最后一个节点 p p-next; } p-next newNode; // 尾节点指向新节点 return L; }4. 遍历链表遍历并打印链表所有节点数据// 遍历链表 void TraverseList(List L) { Node* p L; while (p ! NULL) { printf(%d - , p-data); p p-next; } printf(NULL\n); }5. 按位置插入节点在第pos个位置从 1 开始插入新节点// 在第pos个位置插入节点pos从1开始 List InsertByPos(List L, int pos, int val) { if (pos 1) { printf(插入位置非法\n); return L; } Node* newNode (Node*)malloc(sizeof(Node)); newNode-data val; if (pos 1) { // 插入到头部 newNode-next L; return newNode; } Node* p L; int i 1; while (p ! NULL i pos - 1) { // 找到第pos-1个节点 p p-next; i; } if (p NULL) { printf(插入位置超出链表长度\n); free(newNode); return L; } newNode-next p-next; p-next newNode; return L; }6. 按值删除节点删除第一个值为val的节点// 删除第一个值为val的节点 List DeleteByVal(List L, int val) { if (L NULL) { printf(链表为空无法删除\n); return NULL; } Node* p L; Node* pre NULL; // 找到要删除的节点 while (p ! NULL p-data ! val) { pre p; p p-next; } if (p NULL) { printf(未找到值为%d的节点\n, val); return L; } if (pre NULL) { // 删除的是头节点 L L-next; } else { // 删除的是中间或尾节点 pre-next p-next; } free(p); // 释放节点内存 return L; }7. 按值查找节点查找第一个值为val的节点返回其位置从 1 开始// 查找值为val的节点位置找不到返回0 int SearchByVal(List L, int val) { Node* p L; int pos 1; while (p ! NULL) { if (p-data val) { return pos; } p p-next; pos; } return 0; }四、单链表的优缺点总结优点缺点动态内存分配无需预先指定大小无法随机访问只能从头遍历查找时间复杂度 O (n)插入 / 删除操作仅需修改指针效率高每个节点需要额外存储指针内存开销略大不要求连续内存空间避免内存碎片实现比数组复杂需要手动管理内存

相关文章:

数据结构入门:单链表详解(从原理到实战,新手必看)

在学习 C 语言数据结构时,单链表是绕不开的基础核心。它弥补了数组在插入、删除操作时需要移动大量元素的缺陷,是动态内存管理的经典实现。今天我们就从定义、结构到核心操作,一步步拆解单链表。一、什么是单链表?单链表是一种线性…...

Hunyuan-MT-7B效果展示:蒙古语→汉语政策文件翻译术语统一性与政治准确性

Hunyuan-MT-7B效果展示:蒙古语→汉语政策文件翻译术语统一性与政治准确性 1. 模型核心能力概览 Hunyuan-MT-7B是业界领先的翻译大模型,专门针对多语言互译场景进行了深度优化。该模型支持33种语言的高质量互译,特别在民汉语言翻译方面表现出…...

Windows 10下Tesseract 5.0安装与环境变量配置全攻略(附常见错误排查)

Windows 10下Tesseract 5.0安装与环境变量配置全攻略(附常见错误排查) 在数字化时代,OCR(光学字符识别)技术已经成为从图像中提取文字信息的重要工具。作为开源OCR引擎中的佼佼者,Tesseract凭借其高准确率和…...

ButtonSet:单ADC通道多按键模拟识别库

1. 项目概述ButtonSet 是一个面向嵌入式资源受限环境设计的轻量级多按键模拟输入管理库,其核心工程目标是:在仅占用单个 ADC 通道的前提下,实现对多个物理按键(通常为 4~8 个)的可靠识别与去抖动处理。该方…...

Nunchaku-flux-1-dev惊艳效果展示:水墨丹青、工笔重彩、写意泼墨三种国风风格生成

Nunchaku-flux-1-dev惊艳效果展示:水墨丹青、工笔重彩、写意泼墨三种国风风格生成 如果你对AI绘画的印象还停留在生成一些科幻、动漫或者写实照片,那今天这篇文章可能会让你眼前一亮。最近我深度体验了Nunchaku-flux-1-dev这个模型,它让我看…...

如何用VoiceprintRecognition-Pytorch构建企业级声纹识别系统?从技术原理到落地实践全解析

如何用VoiceprintRecognition-Pytorch构建企业级声纹识别系统?从技术原理到落地实践全解析 【免费下载链接】VoiceprintRecognition-Pytorch This project uses a variety of advanced voiceprint recognition models such as EcapaTdnn, ResNetSE, ERes2Net, CAM, …...

Adafruit Debounce:嵌入式无阻塞按键消抖库详解

1. 项目概述Adafruit Debounce 是一个专为嵌入式微控制器平台(尤其是 Arduino 生态)设计的轻量级、无阻塞(non-blocking)GPIO 按键消抖库。其核心目标并非提供复杂的状态机或高级事件抽象,而是以极简、可预测、零依赖的…...

Pi0+AR:远程维修指导系统开发

Pi0AR:远程维修指导系统开发实战 今天咱们聊一个特别实用的场景——怎么用AI大模型和AR眼镜,搞一套远程维修指导系统。 想象一下这个画面:工厂里一台设备突然出故障了,现场的技术人员可能经验不足,不知道该怎么修。这…...

GLM-OCR详细步骤:模型加载耗时1-2分钟的优化方向——量化/LoRA/FlashAttention适配

GLM-OCR详细步骤:模型加载耗时1-2分钟的优化方向——量化/LoRA/FlashAttention适配 1. 项目概述与性能挑战 GLM-OCR是一个基于GLM-V编码器-解码器架构构建的多模态OCR模型,专门为复杂文档理解而设计。这个模型集成了在大规模图文数据上预训练的CogViT视…...

Phi-4-reasoning-vision-15B多场景落地实证:OCR提效60%、图表分析提速5倍

Phi-4-reasoning-vision-15B多场景落地实证:OCR提效60%、图表分析提速5倍 1. 视觉多模态推理新标杆 Phi-4-reasoning-vision-15B是微软最新发布的视觉多模态推理模型,它正在重新定义图像理解和文档处理的效率边界。想象一下,一个能同时看懂…...

Gemma-3-12b-it性能实测对比:Flash Attention 2加速下GPU利用率提升180%

Gemma-3-12b-it性能实测对比:Flash Attention 2加速下GPU利用率提升180% 1. 项目背景与技术特点 Google Gemma-3-12b-it是一款强大的多模态大模型,支持图文混合输入与自然语言生成。在实际应用中,12B参数规模的模型对计算资源要求极高&…...

HG-ha/MTools实操手册:利用音视频编辑模块实现AI驱动的自动章节分割+封面生成

HG-ha/MTools实操手册:利用音视频编辑模块实现AI驱动的自动章节分割封面生成 1. 工具简介与核心价值 HG-ha/MTools是一款功能全面的现代化桌面工具,集成了图片处理、音视频编辑、AI智能工具和开发辅助等多项功能。这款工具最大的特点是开箱即用&#x…...

GPT-SoVITS音频处理全流程:从UVR5降噪到ASR打标的避坑指南

GPT-SoVITS音频处理全流程实战:从降噪优化到智能标注的进阶技巧 在数字内容创作爆发的时代,高质量语音合成技术正在重塑游戏开发、有声读物和虚拟主播等行业的工作流程。作为开源语音合成领域的黑马,GPT-SoVITS以其出色的音色克隆能力和相对友…...

树莓派业余无线电 WPSD 安装与 GPS 集成指南

1. 树莓派与WPSD入门指南 第一次接触树莓派和WPSD的朋友可能会觉得这两个名词有点陌生。简单来说,树莓派就像一台信用卡大小的微型电脑,而WPSD则是专门为业余无线电爱好者开发的操作系统镜像。把它们组合起来,就能搭建一个功能强大的便携式无…...

Qwen1.5-1.8B GPTQ学术研究:互联网信息检索与摘要生成

Qwen1.5-1.8B GPTQ学术研究:互联网信息检索与摘要生成 1. 引言 如果你正在准备一篇学术论文或者研究报告,最头疼的环节是什么?我猜很多人会说是“文献调研”。面对一个全新的研究主题,你需要在浩如烟海的互联网学术资源里&#…...

AnythingtoRealCharacters2511开源可部署价值:规避SaaS服务数据外泄风险,自主可控

AnythingtoRealCharacters2511开源可部署价值:规避SaaS服务数据外泄风险,自主可控 你是否曾想过,将心爱的动漫角色“真人化”会是什么样子?或者,作为一名内容创作者,你是否需要将动漫IP转化为更贴近现实的…...

Nunchaku-flux-1-dev商业应用:本地部署实现AI绘画零调用成本

Nunchaku-flux-1-dev商业应用:本地部署实现AI绘画零调用成本 1. 引言:当AI绘画遇上本地部署 如果你正在寻找一个能理解中文、生成高质量图片,并且完全由自己掌控的AI绘画工具,那么Nunchaku-flux-1-dev可能就是你的答案。 想象一…...

Python 爬虫采集训练数据:构建自定义场景的 Lingbot 微调数据集

Python 爬虫采集训练数据:构建自定义场景的 Lingbot 微调数据集 想用最新的视觉模型做点自己的事,比如让它专门看懂你所在行业的图片,却发现网上找不到现成的数据集?这可能是很多开发者遇到的头疼事。就拿室内设计来说&#xff0…...

办公文档处理神器!OpenDataLab MinerU智能文档理解5分钟上手教程

办公文档处理神器!OpenDataLab MinerU智能文档理解5分钟上手教程 1. 为什么你需要这个工具? 每天面对堆积如山的PDF报告、PPT演示文稿和扫描文件,你是否也遇到过这些烦恼? 重要会议前需要快速提取几十页PDF中的关键数据&#x…...

Arduino轻量Morse编码库:音频/光脉冲实时输出

1. 项目概述 MorseEncoder 是一款专为 Arduino 平台设计的轻量级嵌入式 Morse 编码库,其核心目标是将常见数据类型(字符、字符串、整数等)实时转换为符合国际标准的 Morse 码信号,并通过硬件外设以 音频脉冲 或 光脉冲 两种物…...

Qwen3.5-35B-AWQ-4bit效果对比:AWQ-4bit量化 vs GPTQ-4bit在图文任务精度差异

Qwen3.5-35B-AWQ-4bit效果对比:AWQ-4bit量化 vs GPTQ-4bit在图文任务精度差异 1. 多模态量化模型概述 Qwen3.5-35B-A3B-AWQ-4bit是一款面向视觉多模态理解的量化模型,支持图片理解、图文问答、视觉描述等核心能力。该模型特别适合需要图片分析和图文对…...

Windows下开源C/C++库动态链接实战指南

1. Windows平台开源库编译与动态链接实践指南在嵌入式系统开发中,跨平台代码迁移是常见需求。当需要将原本运行于嵌入式Linux环境的通信中间件、协议栈或算法模块迁移到Windows平台进行功能验证、性能仿真或上位机开发时,开发者面临的核心挑战并非逻辑重…...

智谱AI GLM-Image实践:旅游宣传册图片自动生成

智谱AI GLM-Image实践:旅游宣传册图片自动生成 1. 引言:当旅游营销遇上AI绘图 想象一下,你是一家旅行社的市场专员,老板要求你在一周内为即将到来的“海岛度假季”制作一套全新的宣传册。你需要几十张不同主题、不同风格的图片&…...

嵌入式RNG硬件随机数生成器工程实践与安全集成

1. RNG:嵌入式系统中真随机数生成器的工程实现与安全应用在嵌入式系统开发中,“随机性”远非rand()函数所能承载。从TLS握手密钥派生、安全启动种子生成,到无线通信跳频序列初始化,再到防重放攻击的nonce构造,高质量随…...

Qwen1.5-1.8B-Chat-GPTQ-Int4效果对比:中文数学推理(MathGLM Benchmark)表现

Qwen1.5-1.8B-Chat-GPTQ-Int4效果对比:中文数学推理(MathGLM Benchmark)表现 1. 模型简介与测试背景 通义千问1.5-1.8B-Chat-GPTQ-Int4是一个经过量化压缩的轻量级对话模型,基于Qwen1.5架构开发。这个模型采用了GPTQ量化技术&am…...

面向工业落地的目标检测:实时手机检测-通用DAMOYOLO框架优势解读

面向工业落地的目标检测:实时手机检测-通用DAMOYOLO框架优势解读 1. 快速上手:用ModelScope和Gradio部署手机检测模型 想要快速体验高性能手机检测?不用复杂的环境配置,不用漫长的模型训练,通过ModelScope和Gradio&a…...

Pycharm+Python之wxPython环境配置与实战入门

1. 为什么选择wxPython开发GUI应用 如果你正在寻找一个简单易用但又功能强大的Python GUI开发工具,wxPython绝对值得考虑。作为一个在Python领域摸爬滚打多年的开发者,我尝试过各种GUI框架,最终发现wxPython是最适合快速开发桌面应用的选择之…...

Nanbeige4.1-3B保姆级教程:WebUI中上传文件解析PDF/Markdown内容

Nanbeige4.1-3B保姆级教程:WebUI中上传文件解析PDF/Markdown内容 你是不是经常遇到这样的烦恼:手头有一堆PDF报告、Markdown文档,想快速提炼里面的关键信息,却要一页页翻看,费时又费力?或者,你…...

VSCode党福音:通义灵码插件深度体验,从代码补全到单元测试一键搞定

VSCode党福音:通义灵码插件深度体验,从代码补全到单元测试一键搞定 作为一名长期与VSCode为伴的全栈开发者,我几乎尝试过市面上所有主流代码辅助工具。从早期的IntelliSense到后来的GitHub Copilot,每次技术迭代都带来效率的跃升。…...

面试官问起Python高级特性,我用这7个知识点让他闭嘴惊艳

从浅拷贝到装饰器,一文搞定Python高级语法核心要点在Python面试中,高级语法往往是区分初级和中级开发者的分水岭。很多人在写Python代码时,只停留在基础语法层面,但对于浅拷贝与深拷贝的区别、迭代器与生成器的原理、闭包与装饰器…...