带头循环双向链表专题

1. 双向链表的结构

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

2. 双向链表的实现

2.1双向链表结构

typedef  int DataType;
typedef struct ListNode
{struct ListNode* perv;DataType val;struct ListNode* next;
}ListNode; 

双向链表有两个方向,所以要定义两个是指针,perv指向前一个节点,next指向后一个节点。

2.2开辟新节点

ListNode* NewNode(DataType x)
{ListNode* note = (ListNode*)malloc(sizeof(ListNode));if (note == NULL){perror("malloc");exit(0);}note->val = x;note->next = note->perv = note;return note;
}

当我们要插入新节点,或者初始化头结点时,需要开辟一个新节点。因为链表要循环,所以新节点的perv和next指针不能只想为NULL,要指向自己。

2.3初始化链表

void STInit(ListNode** pphead)
{*pphead = NewNode(-1);
}

双向带头循环链表的初始化就是建立头节点(哨兵位)。随便赋一个值就可以。

2.4双向链表头插

void HeadAdd(ListNode* phead, DataType x)
{assert(phead);ListNode* newnote = NewNode(x);newnote->next = phead->next;newnote->perv = phead;phead->next->perv = newnote;phead->next = newnote;
}

头插实际上是在头节点之后插入新节点。只需将新节点的perv指针指向phead,next指针指向phead->next节点。然后将phead->next的perv指针指向newnote。头节点的next指针指向新节点。

2..5双向链表打印

void ListPrint(ListNode* phead)
{assert(phead);ListNode* pcur = phead->next;while (pcur != phead){printf("%d->", pcur->val);pcur = pcur->next;}
}

双向链表的打印实际上是打印头节点之后的内容。先定义一个指针指向头结点的下一个节点。然后打印,最后让pcur指向下一个节点,重复这个过程,直到pcur指向phead。

2.6尾插

void TailAdd(ListNode* phead, DataType x)
{assert(phead);ListNode* newnode = NewNode(x);newnode->next = phead;newnode->perv = phead->perv;newnode->perv->next = newnode;phead->perv = newnode;
}

双向链表的尾插,首先要向内存申请一个新节点。新节点的perv指针指向phead->perv节点,next指针指向phead节点。phead->perv的next指针指向新节点。头结点的perv节点指向新节点。

2.7尾删

void TailDel(ListNode* phead)
{assert(phead && phead->next != phead);ListNode* del = phead->perv;del->perv->next = phead;phead->perv = del->perv;free(del);del = NULL;
}

先将要删除的节点的地址存起来,否则改完指针指向后就找不到了。改完指针指向后再释放del。

2.8头删

void HeadDel(ListNode* phead)
{assert(phead && phead->next != phead);ListNode* del = phead->next;del->next->perv = phead;phead->next = del->next;free(del);del = NULL;
}

头删即删除头节点之后的节点。同样要先把要删除的节点存起来。在改变指针指向之后把del释放。

2.9查找某一结点是否存在

ListNode* Find(ListNode* phead, DataType x)
{assert(phead);ListNode* pcur = phead->next;while (pcur != phead){if (pcur->val == x){return pcur;}}return -1;
}

遍历链表,查找某节点是否存在,如果存在则返回该节点的地址,若不存在返回一个小于0的值。

2.10在指定位置指点之后插入节点

void PosBAdd(ListNode* pop, DataType x)
{ListNode* newnode = NewNode(x);newnode->next = pop->next;newnode->perv = pop;pop->next->perv = newnode;pop->next = newnode;
}

同样也是简单的改变指针的指向。

2.11删除指定位置节点

void PosDel(ListNode* pop)
{pop->perv->next = pop->next;pop->next->perv = pop->perv;free(pop);pop = NULL;
}

改变指针指向后在释放掉要删除的节点。

2.12销毁链表

void ListDesTroy(ListNode* phead)
{ListNode* pcur = phead->next;while (pcur != phead){ListNode* next = pcur->next;free(pcur);pcur = next;}
}

销毁链表即逐个节点释放,但是在释放结点之前要先将下一个结点的地址存起来,因为如果不存起来就无法找到下一个节点。

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

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

相关文章

最新AI创作系统ChatGPT网站源码Midjourney-AI绘画系统,Suno-v3-AI音乐生成大模型。

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,那么如何搭建部署AI创作ChatGPT?小编这里写一个详细图文教程吧。已支持GPT…

Java-校验规则Integer使用 @NotEmpty注解报错

ApiModelProperty(value "小组id")NotEmpty(message "小组id 不能为空")private Integer teamId; 1.假如不小心Integer使用NotEmpty注解报错 提示: No validator could be found for constraint javax.validation.constraints.NotEmpty va…

Ubuntu终端自动补全

文章目录 前言配置安装zsh安装 oh-my-zsh安装自动补全插件zsh-autosuggestions 参考 前言 Oh My Zsh 是一个针对命令行 shell 的开源框架,主要用于增强和美化命令行环境。它建立在 Zsh(一种强大的 shell 替代品)之上,提供了丰富的…

Kubernetes Kubelet 的 Cgroups 资源限制机制分析

前言 容器技术的两大技术基石,想必大家都有所了解,即 namespace 和 cgroups。但你知道 cgroups 是如何在 kubernetes 中发挥作用的吗?kubelet 都设置了哪些 cgroups 参数来实现对容器的资源限制的呢?本文就来扒一扒 Kubernetes k…

深度学习框架比较:TensorFlow vs PyTorch

TensorFlow和PyTorch是目前最流行的两个深度学习框架。它们都提供了强大的功能和灵活性,用于构建和训练复杂的深度学习模型。但是,它们在设计理念、用户体验和特定用例支持方面存在一些差异。以下是TensorFlow和PyTorch之间的比较,涵盖了它们…

使用队列对二叉树进行广度遍历

我们要对二叉树进行广度遍历,经典的数据结构就是队列,这也是许多算法题中要用到的基础,下面是一些基本思想 我们首先创建一个队列,开始遍历二叉树,这里记录一个值len,表示当前层有多少个元素,当…

Qt | 键盘事件

Qt | 鼠标事件第四节十、键盘事件 1、Qt 使用 QKeyEvent 类来描述与键盘有关的信息,比如按下或释放键的代码,使用枚举类型 QEvent::Type 描述与键盘有关的事件,比如 QEvent::KeyPress 表示键盘按下事件, QEvent::KeyRelease表示键盘释放事件等。 2、是否接收键盘事件,最…

STC8H8K64U I2C主机模式相关寄存器

STC8H8K64U I2C主机模式相关寄存器 STC8H8K64U-TSSOP20 I2CCFG I2C配置寄存器 I2CMSCR I2C主机控制寄存器 I2CMSST I2C主机状态寄存器 I2CMSAUX I2C主机辅助控制寄存器 I2CTXD I2C数据发送寄存器 I2CRXD I2C数据接收寄存器 I2CCFG I2C配置寄存器 B7ENI2C ENI2C&#xff1a…

文件多进程、多线程访问

处理多进程和多线程的文件读写操作需要确保对共享资源的访问是同步的,以防止数据竞争和不一致性。以下是一些常用的策略和工具: 多线程同步: 内置锁 (synchronized 关键字):使用 Java 的 synchronized 关键字对代码块或方法进行同…

Android Compose页面跳转Demo

1.引入依赖 //jetpack compose导航 implementation("androidx.navigation:navigation-compose:2.5.3") 2.代码 import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundat…

基于Spring Boot的家具销售电商平台设计与实现

基于Spring Boot的家具销售电商平台设计与实现 开发语言:Java框架:springbootJDK版本:JDK1.8数据库工具:Navicat11开发软件:eclipse/myeclipse/idea 系统部分展示 系统功能界面图,在系统首页可以查看首页…

Web集群_02

Web集群_01 Keepalived 概述 Keepalived实现了高可用集群 Keepalived最初是为LVS设计 , 专门监控各种服务器节点的状态 Keepalived 后加入了 VRRP 功能 , 防止单点故障 VRRP ( 虚拟冗余路由协议 ) VRRP能在不改变网组的情况下 , 将多台路由器虚拟成一个虚拟路由器 , 通过配…

【ZZULIOJ】1079: a+b(多实例测试2)(Java)

目录 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 code 题目描述 计算AB 输入 输入数据有多组。 每组一行,为整数A, B。 输出 对每行输入,输出AB的值,单独占一行。 样例输入 Copy 1 2 3 4样例输出 Copy 3 7 提示 …

川宁生物环保方面优势明显合成生物学赋能未来

川宁生物一直秉持着"树立全球抗生素行业环保典范"的理念,在环保方面进行了大量的投入,总计超过27亿元人民币,占项目总投资的30%以上。川宁生物建设了一个占地面积超过300亩的环保系统,占厂区总面积的20%以上。在中国对抗…

《智能前沿:应对ChatGPT算力挑战》

在全球人工智能热潮中,以 ChatGPT 为代表的 AIGC 技术引发了广泛关注。人工智能和机器学习等技术对数据规模及处理速度等提出了更高要求。在数据成为主要生产要素的当下和未来,如何跟上时代的发展步伐,构建适应 AI 需求的数据中心&#xff0c…

基于Google Gemini 探索大语言模型在医学领域应用评估和前景

概述 近年来,大规模语言模型(LLM)在理解和生成人类语言方面取得了显著的飞跃,这些进步不仅推动了语言学和计算机编程的发展,还为多个领域带来了创新的突破。特别是模型如GPT-3和PaLM,它们通过吸收海量文本…

BUUCTF---misc---[SWPU2019]我有一只马里奥

1、下载附件是一个.exe文件 2、运行之后可以看到桌面生成了1.txt文件,文件里面有如下内容 3、经过信息搜索:NTFS(New Technology File System)是一种由Microsoft开发的专有日志文件系统。根据它的提示,应该是把flag.tx…

B2弹幕插件优化版WordPress插件

源码下载:B2弹幕插件.zip 这是b2独有的站点信息弹幕插件,专门用来在首页显示站点动态的一款个性化 WordPress插件。喜欢的可以下载回去进行二次开发,还是蛮不错的 基于wordpress 7B2主题开发的一款弹幕插件/气泡插件 功能一览 插件安装&a…

三、CPU基础-缓存

计算机中缓存一般分为两个部分 1.内存 2.CPU Cache 一、CPU Cache分级 CPU Cache 通常分为大小不等的三级缓存,分别是 L1 Cache、L2 Cache 和 L3 Cache。 L1 Cache 和 L2 Cache 都是每个 CPU 核心独有的(通常会分为「数据缓存」和「指令缓存」&#…