双向链表介绍

news2025/1/12 3:44:42

带头链表⾥的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这⾥“放哨的”。哨兵位存在的意义:避免链表出现死循环
 

双向链表的结构:数据+指向下一个节点的指针+指向前一个节点的指针

typedef int LTDataType;
typedef struct ListNode
{
   LTDataType data;
   struct Listnode* prev;
   struct Listnode* next;
}LTNode;
 

双向链表为空,只有一个头结点。 

首先我们进行初始化:

void LTInit(LTNode**pphead);//双向链表的初始化
LTNode* LTBuyNode(LTDataType x)
{
   LTNode*node=(LTNode*)malloc(sizeof(LTNode));
   if(node==NULL)
   {
       perror("malloc fail");
       exit(1);
    }
   node->data=x;
   node->next=node->prev=node;
   return node;
}
   

void LTPushBack(//插入链表之前,链表必须初始化到只有一个头节点的情况
{
    //给链表创建一个哨兵位
    *pphead=LTBuyNode(-1);
}

插入数据

首先我们要申请一个新的节点,再改变指针的指向。 

void LTPushBack(LTNode* pphead,LTDataType x)//不改变头结点的位置,只用传一级指针就可以
{
    assert(phead);//首先头指针不能为空
    //先把newnode插入链表,再改变原链表前驱节点和后继节点指针的指向
    newnode->prev=phead->prev;
    newnode->next=phead;
    phead->prev->next=newnode;//先改变原头节点的前驱节点的后继节点
    phead->prev=newnode;
}
    
    

这个函数对空链表的情况也满足。

打印链表

void LTPrint(LTNode*phead)
{
   LTNode*pcur=phead->next;
   while(pcur!=phead)
   {
      printf("%d->",pcur->data);
      pcur=pcur->next;
   }
   printf("\n");
}

头插

往头结点的后面插入

void LTPushFront(LTNode* phead,LTDataType x)
{
   assert(phead);
   LTNode* newnode=BuyNode(x);
   
   newnode->next=phead->next;
   newnode->prev=head;

   phead->next->prev=newnode;
   phead->next=newnode;
}

尾删

void LTPopBack(LTNode* phead)
{
    //链表必须有效且链表不能为空
   assert(phead&&phead->next!=phead);
   LTNode*del=phead->prev;//把头结点的上一个节点储存起来
   del->prev->next=phead;
   phead->prev=del->prev;
   free(del);
   del=NULL:
}

 头删

void LTPopFront(LTNode* phead)
{
    assert(phead&&phead->next!=phead);
    LTNode* del=phead->next;
    phead->next=del->next;
    del->next->prev=phead;
    free(del);
    del=NULL;
}

在pos位置之后插入数据

void LTFind(LTNode* phead,LTDataType x)
{
     LTNode*pcur=phead->next;
     while(pcur!=phead)
     {
         if(pcur->data==x)
         {
             return pcur;
         }
         pcur=pcur->next;
     }
     return NULL;
}

 

void LTInsert(LTNode* pos,LTDataType x)
{
    assert(pos);
    LTNode*newnode=LTBuyNode(x);
    newnode->next=pos->next;
    newnodeprev=pos;
    pos->next->prev=newnode;
    pos->next=newnode;
}

LTInsert方法包含了头插

删除pos节点

void LTErase(LTNode* pos)
{
     assert(pos);
     pos->next->prev=pos->prev;
     pos->prev->next=pos->next;
     free(pos);
     pos=NULL;
}
     

销毁链表

void LTDestory(LTNode* phead)
{
   assert(phead);
   LTNode* pcur=phead->next;
   while(pcur!=phead)
   {
        LTNode* next=pcur->next;
        free(pcur);
        pcur=next;
    }
    //此时pcur指向phead,而phead还没有被销毁
   free(phead);
   phead=NULL;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1623919.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postman - 设置变量

场景: 比如你接口都有权限,访问需要每调一个接口都手动放token的值,这个时候就可以搞个全局的变量,只设置一次就可以了 1、设置变量 Environments -> Globals - > 设置key 、value 2、使用变量 {{你得变量名-key}} 3…

[Linux][多线程][四][线程同步][POSIX信号量][环形队列生产者消费者模型][线程池]

目录 1.POSIX信号量1.基本概念2.为什么要有信号量? --> 提高效率3.信号量的PV操作4.PV操作必须是原子操作5.申请信号量失败被挂起等待6.理解信号量大致结构 2.信号量函数1.初始化2.销毁3.等待信号量 -- 申请信号量 --> P()4.发布信号量 -- 释放信号量 --> V() 3.基于…

LeetCode 2739. 总行驶距离

题目链接https://leetcode.cn/problems/total-distance-traveled/?envTypedaily-question&envId2024-04-25 简单题,看代码思考一下即可理解 class Solution {public int distanceTraveled(int mainTank, int additionalTank) {int res 0;while (mainTank >…

探索直播+电商系统中台架构:连接消费者与商品的智能纽带

随着直播电商的崛起,电商行业进入了全新的智能时代。直播形式的互动性和即时性为消费者提供了全新的购物体验,而电商平台则为商品的展示、销售和配送提供了强大的支持。在这一背景下,直播电商系统中台架构成为了连接消费者与商品的智能纽带&a…

模块化 手写实现webpack

模块化 common.js 的导入导出方法: require \ export 和 module.exports export 和 module.export nodejs 内存1.4G -> 2.8G cjs ESModule 主要区别: require属于动态类型:加载执行 同步 esmodul是静态类型:引入时并不会真的去…

Oracle 21 C 安装详细操作手册,并配置客户端连接

Oracle 21 C 安装详细操作手册 Win 11 Oracle 21C 下载: Database Software Downloads | Oracle 中国 云盘共享 链接:https://pan.baidu.com/s/12XCilnFYyLFnSVoU_ShaSA 提取码:nfwc Oracle 21C 配置与登陆: 开始菜单 NetMa…

一线实战,一次底层超融合故障导致的Oracle异常恢复

背景概述 某客户数据由于底层超融合故障导致数据库产生有大量的坏块,最终导致数据库宕机,通过数据抢救,恢复了全部的数据。下面是详细的故障分析诊断过程,以及详细的解决方案描述: 故障现象 数据库宕机之后&#xff0c…

重要!!!涉及huggingface和kaggle的深度学习各种(文本图像视频音频)任务及其对应模型和案例代码总结

可以到hugging face官网,里面有对应的各种学习任务,数据集以及代码和预训练模型也可以到kaggle官网,里面有各种模型以及代码、数据集等。特色优势是:里面对应的数据集和模型都会有超过3个的代码,是用户发布的。 https…

如何批量跟踪京东物流信息

随着电商行业的快速发展,快递业务日益繁忙,无论是商家还是消费者,都需要一种高效、便捷的快递查询工具。快递批量查询高手软件应运而生,以其强大的功能和便捷的操作体验,赢得了广大电商、微商精英们的青睐。 快递批量…

4.25 C高级

思维导图 作业 2.输入两个数,实现两个数的排序 3.输入一个数,计算是否是水仙花 if ((g*g*gs*s*sb*b*bnum)) then echo YES else echo no fi 4.输入一个成绩实现登记判断 90-100A 80-89B 70-79C 60-69D 0-59E

第二证券|光通信概念拉升,吴通控股、胜蓝股份涨停,新易盛等大涨

光通信概念24日盘中强势拉升,截至发稿,吴通控股、胜蓝股份“20cm”涨停,新易盛涨超10%,四川九洲亦涨停,源杰科技、铭普光磁、立昂技能等涨超5%。 吴通控股昨日晚间披露的一季度报告显示,公司完成营业收入1…

CTF网络安全大赛详情

网络安全已成为现代社会的一个关键挑战,随着互联网技术的飞速发展,从个人隐私保护到国家安全,网络安全的重要性日益突显。为了应对这一挑战,CTF(Capture The Flag,中文:夺旗赛)应运而…

Clickhouse离线安装教程

https://blog.51cto.com/u_15060531/4174350 1. 前置 1.1 检查服务器架构 服务器:Centos7.X 需要确保是否x86_64处理器构架、Linux并且支持SSE 4.2指令集 grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 …

java-spring 06 图灵 getBean方法和 doGetBean方法

01.一般的流程是,这里是从上一章的preInstantiateSingleton方法顺序过来的。 getBean() -> doGetBean() -> createBean() -> doCreateBean() -> createBeanInstance() -> populateBean() -> initializeBean() 02.getBean方法,一般就…

网络安全中的加密与解密技术:全面指南及实验

引言 在当今数字时代,加密技术是保护数据安全的重要工具。从个人通讯到企业数据保护,加密帮助确保信息在存储和传输过程中的机密性和完整性。本文旨在全面介绍加密和解密的原理、常见算法以及实验,以帮助读者深入理解其在网络安全中的应用。…

自然资源调查监测评价系统:守护绿色地球的先锋

随着人类对自然资源的日益依赖,如何合理、可持续地利用这些资源成为了全球关注的焦点。自然资源调查监测评价系统,作为守护绿色地球的重要工具,正发挥着越来越重要的作用。本文将带您了解这一系统的内涵、功能及其在现代社会中的意义。一、自…

【SpringBoot】00 Maven配置及创建项目

一、Maven配置 1、下载Maven 进入官网下载:Maven – Welcome to Apache MavenMaven – Download Apache Maven 本文以最新版为例,可按需选择版本 Maven – Welcome to Apache Maven 2、解压下载好的安装包 将安装包解压到自己设置的空文件夹中 3、…

Pytorch学习之路 - CNN

目录 理论预热 实践 构建卷积神经网络 卷积网络模块构建 实战:基于经典网络架构训练图像分类模型 数据预处理部分: 网络模块设置: 网络模型保存与测试 实践 制作好数据源: 图片 标签 展示下数据 加载models中提供的模…

基于Spingboot+vue协同过滤音乐推荐管理系统

项目演示视频效果: 基于Spingbootvue协同过滤音乐推荐管理系统 基于Spingbootvue协同过滤音乐推荐管理系统 1、项目介绍 基于Springboot的音乐播放管理系统总共两个角色,用户和管理员。用户使用前端前台界面,管理员使用前端后台界面。 有推荐…

【A-025】基于SSH的房屋中介管理系统(含论文)

【A-025】基于SSH的房屋中介管理系统(含论文) 开发环境: Jdk7(8)Tomcat7(8)MySQLIntelliJ IDEA(Eclipse) 数据库: MySQL 技术: SpringStruts2HiberanteJquery 适用于: 课程设计,毕业设计&am…