【数据结构初阶】双链表
双链表
- 1.双链表的实现
- 1.1结口实现
- 1.2申请结点
- 1.3初始化双链表
- 1.4打印双链表
- 1.5尾插
- 1.6尾删
- 1.7头插
- 1.8头删
- 1.9计算大小
- 1.10查找
- 1.11pos位置插入
- 1.12删除pos位置
- 1.12删除双链表
- 全部码源
1.双链表的实现
1.1结口实现
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int LTDateType;
typedef struct ListNode
{struct ListNode* next;struct ListNode* prev;LTDateType date;
}LTNode;//创造结点
LTNode* BuyLTNode(LTDateType x);//初始化双链表
LTNode* LTInit();//打印双链表
void LTPrint(LTNode* phead);//尾插
void LTPushBack(LTNode* phead, LTDateType x);//尾删
void LTPopBack(LTNode* phead);//头插
void LTPushFront(LTNode* phead, LTDateType x);//头删
void LTPopFront(LTNode* phead);//计算
int LTSize(LTNode* phead);//查找
LTNode* LTFind(LTNode* phead, LTDateType x);//pos位置插入
void LTInsert(LTNode* pos, LTDateType x);//删除pos位置
void LTErase(LTNode* pos);//销毁双链表
void LTDestroy(LTNode* phead);
1.2申请结点
//创造结点
LTNode* BuyLTNode(LTDateType x)
{LTNode* node = (LTNode*)malloc(sizeof(LTNode));if (node == NULL){perror("malloc fail");exit(-1);}node->date = x;node->next = NULL;node->prev = NULL;return node;
}
1.3初始化双链表
//初始化双链表
LTNode* LTInit()
{LTNode* phead = BuyLTNode(0);phead->next = phead;phead->prev = phead;return phead;
}
1.4打印双链表
//打印双链表
void LTPrint(LTNode* phead)
{assert(phead);printf("phead<=>");LTNode* cur = phead->next;while (cur != phead){printf("%d<=>", cur->date);cur = cur->next;}printf("\n");
}
1.5尾插

//尾插
void LTPushBack(LTNode* phead, LTDateType x)
{assert(phead);LTNode* tail = phead->prev;LTNode* newnode = BuyLTNode(x);newnode->prev = tail;tail->next = newnode;newnode->next = phead;phead->prev = newnode;
}
1.6尾删

//尾删
void LTPopBack(LTNode* phead)
{assert(phead);assert(phead->next != phead);LTNode* tail = phead->prev;LTNode* tailPrev = tail->prev;free(tail);tailPrev->next = phead;phead->prev = tailPrev;
}
1.7头插

//头插
void LTPushFront(LTNode* phead, LTNode* x)
{assert(phead);LTNode* newnode = BuyLTNode(x);LTNode* first = phead->next;phead->next = newnode;newnode->prev = phead;newnode->next = first;first->prev = newnode;
}
1.8头删

//头删
void LTPopFront(LTNode* phead)
{assert(phead);assert(phead->next != phead);LTNode* first = phead->next;LTNode* second = first->next;free(first);phead->next = second;second->prev = phead;
}
1.9计算大小
//计算
int LTSize(LTNode* phead)
{assert(phead);int size = 0;LTNode* cur = phead->next;while (cur != phead){size++;cur = cur->next;}return size;
}
1.10查找
//查找
LTNode* LTFind(LTNode* phead, LTDateType x)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){if (cur->date == x)return cur;cur = cur->next;}return NULL;
}
1.11pos位置插入

//在pos位置插入
void LTInsert(LTNode* pos, LTDateType x)
{assert(pos);LTNode* posPrev = pos->prev;LTNode* newnode = BuyLTNode(x);posPrev->next = newnode;newnode->prev = posPrev;newnode->next = pos;pos->prev = newnode;
}
1.12删除pos位置

//删除pos位置
void LTErase(LTNode* pos)
{assert(pos);LTNode* posNext = pos->next;LTNode* posPrev = pos->prev;free(pos);posPrev->next = posNext;posNext->prev = posPrev;
}
1.12删除双链表
//销毁双链表
void LTDestroy(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){LTNode* next = cur->next;free(cur);cur = cur->next;}free(phead);
}
全部码源
List.h
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int LTDateType;
typedef struct ListNode
{struct ListNode* next;struct ListNode* prev;LTDateType date;
}LTNode;//创造结点
LTNode* BuyLTNode(LTDateType x);//初始化双链表
LTNode* LTInit();//打印双链表
void LTPrint(LTNode* phead);//尾插
void LTPushBack(LTNode* phead, LTDateType x);//尾删
void LTPopBack(LTNode* phead);//头插
void LTPushFront(LTNode* phead, LTDateType x);//头删
void LTPopFront(LTNode* phead);//计算
int LTSize(LTNode* phead);//查找
LTNode* LTFind(LTNode* phead, LTDateType x);//pos位置插入
void LTInsert(LTNode* pos, LTDateType x);//删除pos位置
void LTErase(LTNode* pos);//销毁双链表
void LTDestroy(LTNode* phead);
List.c
#include"List.h"//创造结点
LTNode* BuyLTNode(LTDateType x)
{LTNode* node = (LTNode*)malloc(sizeof(LTNode));if (node == NULL){perror("malloc fail");exit(-1);}node->date = x;node->next = NULL;node->prev = NULL;return node;
}//初始化双链表
LTNode* LTInit()
{LTNode* phead = BuyLTNode(0);phead->next = phead;phead->prev = phead;return phead;
}//打印双链表
void LTPrint(LTNode* phead)
{assert(phead);printf("phead<=>");LTNode* cur = phead->next;while (cur != phead){printf("%d<=>", cur->date);cur = cur->next;}printf("\n");
}//尾插
void LTPushBack(LTNode* phead, LTDateType x)
{assert(phead);LTNode* tail = phead->prev;LTNode* newnode = BuyLTNode(x);newnode->prev = tail;tail->next = newnode;newnode->next = phead;phead->prev = newnode;
}//尾删
void LTPopBack(LTNode* phead)
{assert(phead);assert(phead->next != phead);LTNode* tail = phead->prev;LTNode* tailPrev = tail->prev;free(tail);tailPrev->next = phead;phead->prev = tailPrev;
}//头插
void LTPushFront(LTNode* phead, LTNode* x)
{assert(phead);LTNode* newnode = BuyLTNode(x);LTNode* first = phead->next;phead->next = newnode;newnode->prev = phead;newnode->next = first;first->prev = newnode;
}//头删
void LTPopFront(LTNode* phead)
{assert(phead);assert(phead->next != phead);LTNode* first = phead->next;LTNode* second = first->next;free(first);phead->next = second;second->prev = phead;
}//计算
int LTSize(LTNode* phead)
{assert(phead);int size = 0;LTNode* cur = phead->next;while (cur != phead){size++;cur = cur->next;}return size;
}//查找
LTNode* LTFind(LTNode* phead, LTDateType x)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){if (cur->date == x)return cur;cur = cur->next;}return NULL;
}//在pos位置插入
void LTInsert(LTNode* pos, LTDateType x)
{assert(pos);LTNode* posPrev = pos->prev;LTNode* newnode = BuyLTNode(x);posPrev->next = newnode;newnode->prev = posPrev;newnode->next = pos;pos->prev = newnode;
}//删除pos位置
void LTErase(LTNode* pos)
{assert(pos);LTNode* posNext = pos->next;LTNode* posPrev = pos->prev;free(pos);posPrev->next = posNext;posNext->prev = posPrev;
}//销毁双链表
void LTDestroy(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){LTNode* next = cur->next;free(cur);cur = cur->next;}free(phead);
}
test.c
#include"List.h"void TestList1()
{LTNode* plist = LTInit();LTPushBack(plist, 1);LTPushBack(plist, 2);LTPushBack(plist, 3);LTPushBack(plist, 4);LTPushBack(plist, 5);LTPrint(plist);LTPopBack(plist);LTPrint(plist);LTPushFront(plist, 20);LTPrint(plist);
}void TestList2()
{LTNode* plist = LTInit();LTPushBack(plist, 1);LTPushBack(plist, 2);LTPushBack(plist, 3);LTPushBack(plist, 4);LTPushBack(plist, 5);LTPrint(plist);LTPopFront(plist);LTPrint(plist);LTSize(plist);
}void TestList3()
{LTNode* plist = LTInit();LTPushBack(plist, 1);LTPushBack(plist, 2);LTPushBack(plist, 3);LTPushBack(plist, 4);LTPushBack(plist, 5);LTPrint(plist);LTNode* pos = LTFind(plist, 3);LTInsert(pos, 20);LTPrint(plist);
}void TestList4()
{LTNode* plist = LTInit();LTPushBack(plist, 1);LTPushBack(plist, 2);LTPushBack(plist, 3);LTPushBack(plist, 4);LTPushBack(plist, 5);LTPrint(plist);LTNode* pos = LTFind(plist, 3);LTErase(pos);LTPrint(plist);
}int main()
{TestList4();return 0;
}
💘不知不觉,【数据结构初阶】双链表 以告一段落。通读全文的你肯定收获满满,让我们继续为数据结构学习共同奋进!!!
相关文章:
【数据结构初阶】双链表
双链表 1.双链表的实现1.1结口实现1.2申请结点1.3初始化双链表1.4打印双链表1.5尾插1.6尾删1.7头插1.8头删1.9计算大小1.10查找1.11pos位置插入1.12删除pos位置1.12删除双链表 全部码源 1.双链表的实现 1.1结口实现 #include<stdio.h> #include<stdlib.h> #inclu…...
Django实战:从零到一构建安全高效的Web应用
目录 一、概述 二、版本控制和部署 1、Git版本控制 2、Docker部署 三、数据库配置 1、配置数据库设置 2、创建数据库模型 四、URL路由和视图 1、定义URL路由 2、创建视图 五、模板渲染 1、创建模板 2、在视图中使用模板 总结 一、概述 Django是一个高级Python W…...
Docker build报错总结,版本过新大避雷!
1.速度太慢报错,需要换源; 在DOCKERFILE中添加镜像; RUN echo "deb http://mirror.sjtu.edu.cn/debian bookworm main non-free contrib" > /etc/apt/sources.list, 2.即使在Dockerfile中换源,但在bul…...
spider 网页爬虫中的 AWS 实例数据获取问题及解决方案
前言 AAWS实例数据对于自动化任务、监控、日志记录和资源管理非常重要。开发人员和运维人员可以通过AWS提供的API和控制台访问和管理这些数据,以便更好地管理和维护他们在AWS云上运行的实例。然而,在使用 spider 框架进行网页爬取时,我们常常…...
flink的window和windowAll的区别
背景 在flink的窗口函数运用中,window和windowAll方法总是会引起混淆,特别是结合上GlobalWindow的组合时,更是如此,本文就来梳理下他们的区别和常见用法 window和windowAll的区别 window是KeyStream数据流的方法,其…...
【机器学习】特征工程:特征选择、数据降维、PCA
各位同学好,今天我和大家分享一下python机器学习中的特征选择和数据降维。内容有: (1)过滤选择;(2)数据降维PCA;(3)sklearn实现 那我们开始吧。 一个数据集中…...
短视频账号矩阵系统saas管理私信回复管理系统
一、短视频矩阵号系统源码开发层面如何来解决? 1.短视频矩阵号系统源码搭建中,首先开发者需要保证api接口的稳定性 ,保证权限应用场景满足官方平台的开发预期。api---待发布、用户管理与授权绑定、私信回复与评论管理等是非常重要的权限接口。…...
利用ETLCloud自动化流程实现业务系统数据快速同步至数仓
现代企业有不少都完成了数字化的转型,而还未转型的企业或商铺也有进行数字化转型的趋势,由此可见,数据已经成为企业决策的重要依据。企业需要先获取数据,将业务系统数据同步至数仓进行整合,然后再进行数据分析。为了更…...
学习c#的第十六天
目录 C# 正则表达式 定义正则表达式 字符转义 字符类 定位点 分组构造 Lookaround 概览 数量词 反向引用构造 替换构造 替代 正则表达式选项 其他构造 Regex 类 代码示例 实例 1 实例 2 实例 3 C# 正则表达式 正则表达式 是一种匹配输入文本的模式。.Net 框…...
【论文阅读笔记】Deep learning for time series classification: a review
【论文阅读笔记】Deep learning for time series classification: a review 摘要 在这篇文章中,作者通过对TSC的最新DNN架构进行实证研究,探讨了深度学习算法在TSC中的当前最新性能。文章提供了对DNNs在TSC的统一分类体系下在各种时间序列领域中的最成功…...
如何将vscode和Linux远程链接:
如何将vscode和Linux远程链接: Remote - SSH - 远程登录Linux 安装Remote - SSH 我们下载完后,就会出现这些图标 这里点一下号 查看一下我们的主机名,并复制 输入ssh 用户名主机名 这里是要将ssh这个文件要放在主机下的哪个路径下ÿ…...
快速傅立叶卷积(FFC)
论文 LaMa: Resolution-robust Large Mask Inpainting with Fourier Convolutions https://github.com/advimman/lama 1.Introduce 解决图像绘制问题——缺失部分的真实填充——既需要“理解”自然图像的大尺度结构,又需要进行图像合成。 通常的做法是在一个大型自…...
藏头诗(C语言)
本题要求编写一个解密藏头诗的程序。 注:在 2022 年 7 月 14 日 16 点 50 分以后,该题数据修改为 UTF-8 编码。 输入格式: 输入为一首中文藏头诗,一共四句,每句一行。注意:一个汉字占三个字节。 输出格…...
适合您的智能手机的 7 款优秀手机数据恢复软件分享
如今,我们做什么都用手机;从拍照到录音,甚至作为 MP3 播放器,我们已经对手机变得非常依恋。这导致我们在手机上留下了很多珍贵的回忆。 不幸的是,我们有可能会丢失手机上的部分甚至全部数据。幸运的是,这不…...
uniapp APP下载流文件execl 并用WPS打开
使用plus.downloader.createDownload 方法将新建下载任务 HTML5 API Reference export default function plusDownload(config){if(!config){console.error("Argument should not be null");return;}const urlrequest.baseUrlconfig.url;let token uni.getStorage…...
【Python】 Python 操作PDF文档
Python 操作PDF文档 1、PDF (便携式文件格式,Portable Document Format)是由Adobe Systems在1993年用于文件交换所发展出的文件格式。 PDF主要由三项技术组成:衍生自PostScript;字型嵌入系统;资料压缩及传…...
vue3-响应式核心
🌈个人主页:前端青山 🔥系列专栏:Vue篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3-响应式核心 响应式核心 目录 响应式核心 3.1ref() 3.2computed () 3.3 reactive() 3.4 …...
人工智能的广泛应用与影响
目录 前言1 智能手机与个人助手2 医疗保健3 自动驾驶技术4 金融领域5 教育与学习6 智能家居与物联网7 娱乐与媒体8 环境保护结语 前言 人工智能(Artificial Intelligence,AI)是当今科技领域的璀璨明星,它不仅在技术创新方面掀起了…...
SAP创建权限对象、角色、并分配角色
一、SU20:维护权限字段 二、SU21创建权限对象,分配权限字段: 三、SU24关联程序和自建权限对象(标准tcode会默认存在标准权限对象) 四、PFCG创建角色 五、SU01给用户分配角色 一、su20:维护权限字段 X点新建: 填入…...
[uni-app]记录APP端跳转页面自动滚动到底部的bug
文章目录 bug描述原因分析: 处理方案 bug描述 1.点击的A页面, 跳转到了B页面, 第一次页面正常显示 2.从B页面返回A页面 3.A页面不进行任何操作,再次点击A页面进入B页面 4.B页面自动滚动到底部. 原因 看一段A页面代码 let that thisthis.defaultScrollTop uni.getStorageSy…...
从FinFET到ESD设计:2013年半导体产业技术演进与工程实践启示
1. 行业动态聚焦:2013年4月,EDA/IP领域的那些关键信号作为一名在芯片设计行业摸爬滚打了十几年的老兵,我习惯每周花点时间翻翻行业新闻,不是为了追热点,而是想从那些看似零散的公告里,嗅出技术演进和产业协…...
2025终极指南:Cursor Free VIP破解工具如何帮你免费解锁AI编程助手所有功能
2025终极指南:Cursor Free VIP破解工具如何帮你免费解锁AI编程助手所有功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Yo…...
PowerToys Awake终极指南:如何让Windows电脑在你需要时永不休眠?
PowerToys Awake终极指南:如何让Windows电脑在你需要时永不休眠? 【免费下载链接】PowerToys Microsoft PowerToys is a collection of utilities that supercharge productivity and customization on Windows 项目地址: https://gitcode.com/GitHub_…...
智能工厂能源监测管理平台解决方案
在某大型制造企业的生产园区,管理人员长期面临着一系列能源管理困境:由于厂区各个电表仍依赖人工抄录,数据滞后且易出错,导致管理层无法实时掌握每条生产线甚至每台关键设备的真实耗电情况;同时,由于电表分…...
为什么“忘记密码“只能重置不能找回?背后藏着一个精妙的数学秘密
99%的人每天都在用它,却从来不知道它的存在你一定遇到过这种事:忘了某个网站的密码,点击"找回密码",结果网站只让你"重置密码"——它为什么不能直接告诉你原来的密码是什么?答案可能出乎你的意料&…...
Android Studio中文界面终极指南:3分钟告别英文开发困境
Android Studio中文界面终极指南:3分钟告别英文开发困境 【免费下载链接】AndroidStudioChineseLanguagePack AndroidStudio中文插件(官方修改版本) 项目地址: https://gitcode.com/gh_mirrors/an/AndroidStudioChineseLanguagePack 还在为Androi…...
Origin 9 绘图避坑指南:7个高频问题解决,让你的科研图表一次成型
Origin 9 科研绘图实战:7个高频问题深度解析与优化方案 科研绘图是数据可视化的重要环节,而Origin 9作为经典的科学绘图软件,其功能强大但操作细节繁多。许多用户在初次接触或日常使用中常会遇到各种棘手问题,导致绘图效率低下、图…...
射频PA中的ICC和ICQ电流是什么?
射频 PA 的 ICC 与 ICQ 深度解析 核心关联:ICQ(静态偏置)与 ICC(工作电流)直接决定 DLCA / ENDC / SRS / RX Desense 的系统稳定性。 一、拍板级定义:ICQ vs ICC 术语 全称 工作状态 核心关注点 ICQ Quiescent Current 静态(无信号或极小信号) 线性度、稳定性、瞬态响应…...
本地视频怎么去水印?2026实测去水印方法+本地视频去水印软件推荐
本地视频怎么去水印?2026实测去水印方法本地视频去水印软件推荐 视频上有水印,是很多人日常都会碰到的麻烦。录屏时工具自动打上的 Logo、剪辑软件试用期留下的标记、从平台保存下来时带着的角标……这些水印有时候影响不大,但只要你想二次使…...
终极AMD锐龙处理器调试指南:深度掌握硬件性能调优的完整解决方案
终极AMD锐龙处理器调试指南:深度掌握硬件性能调优的完整解决方案 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: …...
