双链向表专题

devtools/2024/9/20 7:27:46/ 标签: c语言, 数据结构, c
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="htmledit_views">

1.链表的分类

链表的种类非常多组合起来就有 2 × 2 = 8种

center;">c="https://img-blog.csdnimg.cn/direct/746b41c0534346fd96e2e4f6a7aea739.png" />

 链表说明:

center;">c="https://img-blog.csdnimg.cn/direct/3fb22fc52a75472e9aa425771ddbf0c7.png" />

color:#646a73;">虽然有这么多的链表的结构࿰c;但是我们实际中最常⽤还是两种结构: color:#646a73;">单链表 color:#646a73;">和 color:#646a73;">双向带头循环链表
color:#646a73;">1. 无头单向⾮循环链表:结构简单c;⼀般不会单独⽤来存数据。实际中更多是作为其他数据结
color:#646a73;">构的⼦结构c;如哈希桶、图的邻接表等等。另外这种结构在笔试⾯试中出现很多。
color:#646a73;">2. 带头双向循环链表:结构最复杂c;⼀般⽤在单独存储数据。实际中使⽤的链表class="tags" href="/ShuJuJieGou.html" title=数据结构>数据结构࿰c;都
color:#646a73;">是带头双向循环链表。另外这个结构虽然结构复杂࿰c;但是使⽤代码实现以后会发现结构会带
color:#646a73;">来很多优势࿰c;实现反⽽简单了࿰c;后⾯我们代码实现了就知道了。

2.双向链表的实现

List.h

<code>#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int LTDataType;
typedef struct ListNode {LTDataType Data;struct ListNode* next;struct ListNode* prev;
}LTNode;//初始化链表
LTNode* LTInit();//打印链表
void LTPrintf(LTNode* phead);//申请节点
LTNode* LTBuyNode(LTDataType x);//尾插
void LTPushBack(LTNode* phead, LTDataType x);//头插
void LTPushFront(LTNode* phead, LTDataType x);//尾删
void LTPophBack(LTNode* phead, LTDataType x);//头删
void LTPopFront(LTNode* phead, LTDataType x);//用数据找到该节点
LTNode* LTFind(LTNode* phead, LTDataType x);//在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x);//删除pos位置的数据
void LTErase(LTNode* pos);//销毁链表
void LTDestroy(LTNode* phead);code>

List .c

<code>#define _CRT_SECURE_NO_WARNINGS 1
#include"List.h"//初始化链表
LTNode* LTInit() {LTNode* sbw = LTBuyNode(-1);return sbw;
}//打印链表
void LTPrintf(LTNode* phead) {assert(phead);LTNode* pcur = phead->next;while (pcur != phead){printf("%d->", pcur->Data);pcur = pcur->next;}printf("\n");
}//申请节点
LTNode* LTBuyNode(LTDataType x) {LTNode* node = (LTNode*)malloc(sizeof(LTNode));if (node == NULL){perror("malloc");exit(1);}node->next = node->prev = node;node->Data = x;return node;
}//尾插
//不改变头节点(哨兵卫)࿰c;所以传一级指针,但是可以通过这个指针去改变这个地址下元素的值
void LTPushBack(LTNode* phead, LTDataType x) {assert(phead);LTNode* newnode = LTBuyNode(x);newnode->prev = phead->prev;  //新尾节点prev指向原尾节点newnode->next = phead;        //新尾节点next指向哨兵卫phead->prev->next = newnode;//原尾节点next指向新尾节点phead->prev = newnode;      //哨兵卫prev指向新尾节点
}//头插
void LTPushFront(LTNode* phead, LTDataType x) {assert(phead);LTNode* newnode = LTBuyNode(x);newnode->next = phead->next;newnode->prev = phead;phead->next->prev = newnode;newnode->next = newnode;
}//尾删
void LTPophBack(LTNode* phead, LTDataType x) {assert(phead);LTNode* del = phead->prev ;//原尾节点,相对新尾节点的下一个节点del->prev->next = phead;//新尾节点(原尾节点的上一个节点)的next指向哨兵卫phead->prev = del->prev;//哨兵卫的prev指向新尾节点free(del);del = NULL;
}//头删
void LTPopFront(LTNode* phead, LTDataType x) {assert(phead);LTNode* del = phead->next;//相对哨兵卫的下一个节点del->next->prev = phead;phead->next = del->next;free(del);del = NULL;
}//用节点的Date数据࿰c;找到该节点
LTNode* LTFind(LTNode* phead, LTDataType x) {LTNode* Find = phead->next;while (Find != phead){if (Find->Data == x){return Find;}Find = Find->next;}//没找到return NULL;
}//在指定位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x) {assert(pos);LTNode* newnode = LTBuyNode(x);newnode->next = pos->next;newnode->prev = pos;//一般来说都是先改后面的节点࿰c;避免数据的丢失pos->next->prev = newnode;pos->next = newnode;
}//删除pos位置的数据
void LTErase(LTNode* pos) {assert(pos);pos->next->prev = pos->prev;//处理pos下一个节点的prev指向pos->prev->next = pos->next;//处理pos上一个节点的next指向free(pos);pos = NULL;
}//销毁链表
void LTDestroy(LTNode* phead) {LTNode* pcur = phead->next;while (pcur != phead){LTNode* next = pcur->next;free(pcur);pcur = next;}free(pcur);pcur = NULL;}code>

3.顺序表和双向链表的优缺点分析


http://www.ppmy.cn/devtools/10514.html

相关文章

android学习笔记(五)-MVP模式

1、MVP模式demo的实现&#xff0c;效果下&#xff1a; 2、创建一个Fruit类&#xff1a; package com.example.listview; //Fruit类就是Model&#xff0c;表示应用程序中的数据对象。 public class Fruit {private int imageId;private String name;private String price;publi…

PHP 生成压缩包、读取压缩包

1. PHP 生成压缩包 下面是 PHP 将本地文件生成压缩包的核心代码&#xff0c;在此基础上可进行扩展封装 // 压缩包名称$name test.zip;// 创建压缩包对象$zip new ZipArchive;// 打开压缩包$zip->open($name, ZipArchive::CREATE);// 本地文件绝对路径$path __DIR__ . /In…

布局香港之零售小店篇 | 香港一人小企与连锁超市的竞争

近年来&#xff0c;内地品牌入驻香港市场开拓业务已成大势所趋。香港特区政府早前公布的「2023年有香港境外母公司的驻港公司按年统计调查」显示&#xff0c;2023年母公司在海外及内地的驻港公司数量高达9039家。内地品牌在香港的成功落地&#xff0c;不仅为香港市民带来了丰富…

Flutter 插件站新升级: 加入优秀 GitHub 开源项目

Flutter 插件站新升级: 加入优秀 GitHub 开源项目 视频 https://youtu.be/qa49W6FaDGs https://www.bilibili.com/video/BV1L1421o7fV/ 前言 原文 https://ducafecat.com/blog/flutter-awesome-github-repo-download 这几天晚上抽空把 Flutter 插件站升级&#xff0c;现在支…

端点安全时刻影响着网络安全,我们应该如何保护

端点&#xff08;Endpoint&#xff09;是网络通信中的一个重要概念&#xff0c;指的是网络通信中的发送或接收信息的设备或节点。在一个网络中&#xff0c;端点可以是硬件设备&#xff08;如计算机、服务器、手机、路由器等&#xff09;&#xff0c;也可以是软件应用或服务。端…

搜维尔科技:【工业仿真】煤矿机械安全事故VR警示教育系统

产品概述 搜维尔科技 煤矿机械安全事故VR警示教育系统 系统内容&#xff1a; 系统采用虚拟现实技术模拟矿井井下机械安全技术及事故&#xff0c;展现井下常见机械伤害事故&#xff0c;表现伤害事故的隐患点&#xff0c;能够模拟事故发生和发展过程&#xff1b;营造井下灾害发…

iOS原生与H5交互方法

UIWebView Objective-C 调用 JavaScript 在使用UIWebView时&#xff0c;可以使用stringByEvaluatingJavaScriptFromString:方法来执行JavaScript代码。 示例代码&#xff1a; NSString *result [webView stringByEvaluatingJavaScriptFromString:"returnFunction()&q…

❤️新版Linux零基础快速入门到精通——第三部分❤️

❤️新版Linux零基础快速入门到精通——第三部分❤️ 非科班的我&#xff01;Ta&#xff01;还是来了~~~3. Linux权限管控3.1 认知root用户3.1.1 Switch User——su3.1.2 sudo命令3.1.3 为普通用户配置sudo认证 3.2 用户和用户组3.2.1 用户、用户组3.2.2 用户组管理3.2.3 用户管…

计算机视觉 CV 八股分享 [自用](更新中......)

目录 一、深度学习中解决过拟合方法 二、深度学习中解决欠拟合方法 三、梯度消失和梯度爆炸 解决梯度消失的方法 解决梯度爆炸的方法 四、神经网络权重初始化方法 五、梯度下降法 六、BatchNorm 七、归一化方法 八、卷积 九、池化 十、激活函数 十一、预训练 十二…

数据库服务类--Redis--未授权访问终端Getshell

免责声明:本文仅做技术交流与学习. 目录 前提条件: windows上开启redis服务: Linux上创建&开启redis服务: 操作: 1-连接靶机redis 2-写入webshell 3-访问后门 redis--->webshell Redis未授权访问漏洞复现与利用 - 知乎 (zhihu.com) 前提条件: 端口开放(6379) 目录…

【STM32+HAL+Proteus】系列学习教程---RS485总线(收发仿真实现)

实现目标 1、掌握UART/USART/RS485等几个常见概念的区别 2、掌握RS485的逻辑电平、硬件接线等基础知识 3、具体实现目标&#xff1a;1、利用两个单片机组成RS485通信网络&#xff1b;2、两个单片机之间能实现正常收发数据。 一、串口、RS485等之间的关系 串口&#xff1a;是…

Stable Diffusion是什么

稳定扩散&#xff08;Stable Diffusion&#xff09;是一种数学模型和随机过程&#xff0c;用于描述不同粒子之间的随机运动和扩散过程。它是从随机漫步&#xff08;Random Walk&#xff09;发展而来&#xff0c;并具有一些特定的性质。 在稳定扩散中&#xff0c;粒子的运动是随…

xhs图片获取并且转换成PDF,实现了我考研期间一直想实现的想法

对于一些xhs图文&#xff0c;很多人其实想把它的图片保存到本地&#xff0c;尤其是下图所示的考研英语从文章中背单词&#xff0c;不说别人&#xff0c;我就是这样的。 我在考研期间就想实现把图片批量爬取下来&#xff0c;转成PDF&#xff0c;方便一篇一片阅读进行观看&#…

怎么清理电脑c盘?释放你的存储空间!

随着我们在电脑上的使用&#xff0c;C盘往往会积累大量的临时文件、缓存文件和无用的程序文件&#xff0c;导致C盘空间不足&#xff0c;影响系统性能和运行速度。因此&#xff0c;定期清理电脑C盘是维护电脑健康的重要步骤之一。本文将介绍怎么清理电脑c盘的三种方法&#xff0…

超越GPT-4V,苹果多模态大模型上新,神经形态计算加速MLLM(二)

上文介绍基于MINOnets神经网络架构加速多模态大模型的策略&#xff0c;本文将以Spinnaker2多核神经网络芯片EGRU架构为起点&#xff0c;覆盖存内计算架构&#xff0c;介绍新型计算架构在加速大模型推理的作用。SpiNNaker 2是一个设计用于大规模异步处理的多核神经形态芯片&…

【Flutter】自动生成图片资源索引插件一:FlutterAssetRefGenerator

介绍 FlutterAssetRefGenerator 插件&#xff1a;windows上 点击生成图片索引按钮后&#xff0c;pubspec.yaml 会出现中文乱码&#xff0c;需要手动改乱码&#xff1b;mac上没问题。 优点&#xff1a;点击图标自动生成。 目录 介绍一、安装二、使用 一、安装 安装FlutterAsset…

vscode 解决无法创建临时文件。

报错&#xff1a; Fatal error: cant create C:\Users???y\AppData\Local\Temp\ccqkCS9j.o: No such file or directory 右击此 电脑 -> 属性 打开 系统信息 -> 高级系统设置 系统属性 -> 高级 -> 环境变量 将temp 和 tmp 改为其它英文路径 只更改用户变量…

无人驾驶 自动驾驶汽车 环境感知 精准定位 决策与规划 控制与执行 高精地图与车联网V2X 深度神经网络学习 深度强化学习 Apollo

无人驾驶 百度apollo课程 1-5 百度apollo课程 6-8 七月在线 无人驾驶系列知识入门到提高 当今,自动驾驶技术已经成为整个汽车产业的最新发展方向。应用自动驾驶技术可以全面提升汽车驾驶的安全性、舒适性,满足更高层次的市场需求等。自动驾驶技术得益于人工智能技术的应用…

每日两题 / 438. 找到字符串中所有字母异位词 238. 除自身以外数组的乘积(LeetCode热题100)

438. 找到字符串中所有字母异位词 - 力扣&#xff08;LeetCode&#xff09; 记录p串每个字符出现次数 维护与p串等长的滑动窗口&#xff0c;记录其中每个字符的出现次数 每次滑动后将当前次数与p串的次数比较即可 class Solution { public:vector<int> findAnagrams(s…

php中常见的正则使用方法

在PHP中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找和替换字符串中的模式。下面是一些常见的PHP正则表达式匹配示例: 匹配数字:$pattern = /\d+/; $str = There are 123 apples and 456 oranges.; preg_match($pattern, $str, $matches);