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

C语言 带头双向循环链表的基本操作

带头双向循环链表的基本操作

  • 结构体定义
  • 初始化
  • 创建新节点
  • 头插
  • 头删
  • 尾插
  • 尾删
  • 查找
  • 在指定位置之后插入
  • 删除指定位置的值
  • 打印

结构体定义

typedef int DataType;
typedef struct LinkNode
{DataType data;struct LinkNode* prev;struct LinkNode* next;
}LNode;

初始化

有两种初始化方式
第一种你需要在main函数里或者全局定义一个LNode* phead,注意,只需要定义就可以了,然后再调用Init(&phead);

为什么要传地址呢?
因为在Init函数内部我们需要对phead进行操作(分配空间),那么一旦需要对参数进行操作,那就不能只穿本身,而要传地址。

void Init(LNode** pphead)
{*pphead=(LNode*)malloc(sizeof(LNode));(*pphead)->data=-1;(*pphead)->next=(*pphead)->prev=*pphead;
}

这一种的话,不需要在main函数里创建,直接调用Init_1()函数就行。

void Init_1()
{LNode* phead=(LNode*)malloc(sizeof(LNode));phead->data=-1;phead->prev=phead->next=phead;
}

初始化以后,头结点就是这样子了:
在这里插入图片描述

创建新节点

函数参数为DataType类型

LNode* CreateNode(DataType x)
{LNode* newnode=(LNode*)malloc(sizeof(LNode));newnode->prev=newnode->next=NULL;//这个地方也将prev和next初始化为newnode自身//因为这两个指针后续都会改变方向,因此初始状态无所谓。return newnode;
}

头插

这里的头插指的是在第一个有效节点之前插入,也就是插入到head的后一个。

我们第一步先把新节点的prev和next设置好,因为这样做不影响链表结构,肯定先把简单的搞了嘛~
在这里插入图片描述在这里插入图片描述然后再修改head->next和head->next->prev(图中1号节点)的指向,至于这两个谁先谁后,那就无所谓了。

在这里插入图片描述
头插完以后就是这个样子了

void PushHead(LNode* phead,DataType x)
{LNode* new=CreateNode(x);new->next=phead->next;new->prev=phead;phead->next->prev=new;phead->next=new;
}

头删

头删需要注意的一个点就是判断是否只剩下了一个节点,有些题目会要求头删直至为NULL,有的会要求删到只剩最后一个,我们这里以后者为例
在这里插入图片描述先这么改
在这里插入图片描述再这么改(这两步顺序可以变)
在这里插入图片描述最后再释放掉new节点就可以了(当然考试的时候不释放也行,平时养成这个习惯还是很好的!)

void DelHead(LNode* phead)
{if(phead->next==phead)return;else{LNode* tmp=phead->next;phead->next=tmp->next;tmp->next->prev=phead;   free(tmp);     }
}

尾插

尾插其实就是在头结点的前一个插,所以简单程度可想而知:

void PushBack(LNode*phead,DataType x)
{LNode*new=CreateNode(x);new->next=phead;new->prev=phead->prev;phead->prev->next=new;phead->prev=new;
}

尾删

跟刚才尾插一个道理,就是头结点的前一个。

void DelBack(LNode*phead)
{LNode* tmp=phead->prev;phead->prev=tmp->prev;tmp->prev->next=phead;free(tmp);
}

查找

查找的时候,有时候对查找的开始位置可能也有限制。如果是带头的双循环链表比较好办,如果是不带头的,如果要从phead开始查找,那么开始访问位置cur就得是phead->prev;
我们这里介绍从phead的next开始访问的情况,其他情况趋同,只需要改变初始访问指针cur的值就可以

LNode* Find(LNode* phead,DataType x)
{LNode* cur=phead->next;while(cur!=phead){if(cur->data==x)return cur;cur=cur->next;}return NULL;
}

在指定位置之后插入

跟头插简直一模一样,就是把参数换了个名儿

void Insert(LNode* pos,DataType x)
{LNode* new=CreateNode(x);new->next=pos;new->prev=pos->prev;pos->prev->next=new;pos->prev=new;
}

删除指定位置的值

跟刚才头删尾删一样,有些题可能需要删到最后一个为止

void DelPos(LNode* pos)
{if(pos->next=pos)return;else{LNode* front=pos->prev;LNode* after=pos->next;front->next=after;after->prev=front;}
}

打印

这个地方比较巧妙,如果想让phead的值第一个被打印,那么循环就要用do while 因为如果用了while(cur!=phead),那么循环完全进不去,因为访问指针cur的初始值就为phead,用do while可以先执行一次,执行完之后cur的指向就不再是phead了,然后再判断循环条件。

void Print(LNode* phead)
{LNode* cur=phead;do{printf("%d ",cur->data);cur=cur->next;} while (cur!=phead);}

有两道非常好的双向循环链表的题推荐给大家:
link
这是我写的我们学校作业的题解,
空闲空间申请模拟和 ***文件加密!***这两道题都用到了循环链表,但是比刚刚的基础操作要复杂很多,但是基本的思想都是大差不差的,我在本文中提到的一些注意事项,在这两道题中都有体现,比如说开始访问位置,判断是否为空等等,大家如果想要提高一下可以去看看那两道题哈~

相关文章:

C语言 带头双向循环链表的基本操作

带头双向循环链表的基本操作 结构体定义初始化创建新节点头插头删尾插尾删查找在指定位置之后插入删除指定位置的值打印 结构体定义 typedef int DataType; typedef struct LinkNode {DataType data;struct LinkNode* prev;struct LinkNode* next; }LNode;初始化 有两种初始化…...

MATLAB中扩展卡尔曼滤波误差估计的关键点

在MATLAB中,对于扩展卡尔曼滤波(EKF)的误差估计,主要涉及对系统状态估计的准确性和精度的评估。EKF是一种适用于非线性系统的状态估计方法,它通过递归的方式,结合系统的动态模型和观测模型,来预…...

SpringBoot温习

1.1 Spring Boot ​ Spring Boot是一个开源的Java框架,由Pivotal团队(现在是VMware的一部分)开发,它是Spring框架的一个模块,旨在简化Spring应用程序的初始搭建以及开发过程。 Spring Boot的核心目标是让开发者尽可能…...

Spring Cloud:构建高可用分布式系统的利器

摘要:本文将介绍Spring Cloud,一个基于Spring Boot的开源微服务架构工具集。我们将探讨Spring Cloud的核心组件、特性以及如何使用Spring Cloud构建高可用、分布式系统。通过本文,读者将了解到Spring Cloud在实现微服务架构中的应用和优势。 …...

IT技术 | 电脑蓝屏修复记录DRIVER_IRQL_NOT_LESS_OR_EQUAL

我的台式机是iMac 2015年的,硬盘是机械的,时间久了运行越来越慢。后来对苹果系统失去了兴趣,想换回windows,且想换固态硬盘,就使用winToGo 搞了双系统,在USB外接移动固态硬盘上安装了win10系统。 最近&…...

windows 下编译 TessRact+leptonica 识别图片文字

目录 1、下载 2. 编译基础依赖库 1.1 zlib 1.2 jpegsr9f 1.3 lpng1643 1.4 libgif 3. 编译tifflib 4. 配置nasm到系统环境中 5. 编译 libjpeg-turbo 6 编译leptonica 7. 编译tesseract 8. 测试验证 1、下载 下载tesseract5.3.2 下载leptonica1.83.1 下载l…...

如何把docker里的内容拷贝出来

如何把docker里的内容拷贝出来 要从Docker容器中复制文件或目录出来,可以使用docker cp命令。以下是基本的命令格式和示例: 命令格式: docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH示例: 假设你有一个名为my_container的…...

OpenAI开始训练新的前沿模型——但GPT-5至少在90天内不会推出

ChatGPT 制造商 OpenAI 今早宣布,已开始训练其新的“前沿模型”,并成立了一个新的安全委员会,由现任董事会成员 Bret Taylor(OpenAI 董事会主席兼客户服务初创公司 Sierra AI 联合创始人、前谷歌地图负责人和前 Facebook 首席技术…...

配置 HTTP 代理 (HTTP proxy)

配置 HTTP 代理 [HTTP proxy] 1. Proxies2. curl2.1. Environment2.2. Proxy protocol prefixes 3. Use an HTTP proxy (使用 HTTP 代理)3.1. Using the examples (使用示例)3.1.1. Linux or macOS3.1.2. Windows Command Prompt 3.2. Authenticating to a proxy (向代理进行身…...

mysql binlog查看指定数据库

1.mysql binlog查看指定数据库的方法 MySQL 的 binlog(二进制日志)主要记录了数据库上执行的所有更改数据的 SQL 语句,包括数据的插入、更新和删除等操作。但直接查看 binlog 并不直观,因为它是以二进制格式存储的。为了查看 bin…...

React + SpringBoot开发用户中心管理系统

用户中心项目搭建笔记 技术栈 前端技术栈 “react”: “^18.2.0”,ant-design-pro 后端技术栈 SpringBoot 2.6.x 项目源码地址 https://gitee.com/szxio/user-center 前端项目搭建 快速搭建一个后端管理系统项目框架 初始化 antDesignPro 官网: https://…...

移动机器人定位与导航实训记录

本次实训主要学习ros-tf的使用、slam使用、机器人自主导航,我先简单发出来,等我整理完再重新编辑一边。...

彩灯控制器设计 74ls160+ne555实现

一、选题背景 数字电子技术在我们生活中的应用非常之广泛,不论是在各个方面都会涉及到它,小到家用电器的自动控制,大到神舟九号和天空一号航天器的设计,都无可避免的要运用它。并且鉴于以理论推动实践及理论实践相结合为指导思想,特此用我们所学的理论知识来实践这次课程设…...

Windows API 速查

Windows API 函数大全 (推荐):https://blog.csdn.net/xiao_yi_xiao/article/details/121604742Windows API 在线参考手册:http://www.office-cn.net/t/api/index.html?web.htmWindows 开发文档 (官方):https://learn.microsoft.com/zh-cn/wi…...

智能名片小程序源码系统平台版 人人可创建属于自己的名片 前后端分离 带完整的源代码以及搭建教程

系统概述 智能名片小程序源码系统平台版是一款基于微信小程序的个性化名片搭建平台。该平台采用前后端分离的设计架构,前端提供丰富的界面元素和灵活的布局方式,后端则提供强大的数据支持和功能扩展能力。用户无需具备专业的编程知识,只需按…...

香橙派OrangePI AiPro测评 【运行qt,编解码,xfreeRDP】

实物 为AI而生 打开盒子 配置 扛把子的 作为业界首款基于昇腾深度研发的AI开发板,Orange Pi AIpro无论在外观上、性能上还是技术服务支持上都非常优秀。采用昇腾AI技术路线,集成图形处理器,拥有8GB/16GB LPDDR4X,可以外接32…...

重生之我要精通JAVA--第七周笔记

文章目录 IO流字符流字符流原理解析flush和close方法 文件拷贝代码文件加密解密修改文件中的数据 缓冲流字节缓冲流字符缓冲流例题 转换流序列化流序列化流/对象操作输出流 反序列化流序列化流/反序列化流的细节汇总打印流字节打印流字符打印流 解压缩流压缩流Commons-io常见方…...

MySQL—函数—数值函数(基础)

一、引言 首先了解一下常见的数值函数哪些?并且直到它们的作用,并且演示这些函数的使用。 二、数值函数 常见的数值函数如下: 注意: 1、ceil(x)、floor(x) :向上、向下取整。 2、mod(x,y):模运算&#x…...

fintuning chatglm3

chatglm3介绍 ChatGLM3-6B 是 ChatGLM 系列最新一代的开源模型,在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上,ChatGLM3-6B 引入了如下特性: 更强大的基础模型: ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用…...

草台班子啊草台班子:共享电源导致的BUG(供电不足)

某日吧(其实就是今日,不过什么时候我又删帖重发也不一定啊),下工厂干活,机器里面没多的插座(其实一个插座都没有,但是有一个24V电源的的设备),于是带队的下令并着接&…...

java递归计算文件夹和文件大小

背景 背景发现电脑c盘占用过高,然而我却不清楚是哪些文件占用了磁盘空间,于是我希望用程序来帮我完成这件事。小插曲:开始的时候,我使用python来做的,结果发现效率实在是太低,最后用java重写了一波。有需要的同学可以拿去修改一些。 代码 import java.io.File; import ja…...

硬币检测电路设计

一、来源:凡亿教育 第一场:硬币检测装置原理分析、电路设计以及器件选型_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Zh4y1V7Px/?p1&vd_source43eb1cb50ad3175d7f3b9385905cd88f 二、开发软件:KEIL MDK 三、主控芯片&#…...

3.基础光照

从宏观上讲渲染包含了两大部分:决定一个像素的可见性,决定一个像素的光照计算 而光照模型就是用于决定在一个像素上决定怎样的渲染光照计算。 一、我们是如何看到这个世界的 1.光源 实时渲染中,我们通常把光源当成一个没有体积的点&#…...

Image Search-这是你的图像搜索

Image Search-这是你的图像搜索 什么是图像搜索图像搜索开通图像搜索商品图片搜索图片搜索图片新增批量操作OSS-创建bucket上传文件创建increment.meta并上传元信息导出 体验感受 什么是图像搜索 在接触一个新的产品时,我们首先要知道这款产品是什么?那…...

对GPT-4o的评价:技术革新与未来展望

目录 引言一、GPT-4o的技术背景1.1 GPT系列的发展历程1.2 GPT-4o的技术特点 二、版本间的对比分析2.1 GPT-3与GPT-4的对比2.2 GPT-4与GPT-4o的对比 三、GPT-4o的技术能力3.1 自然语言处理3.2 多模态处理3.3 任务定制化 四、个人整体感受4.1 交互体验4.2 应用场景4.3 未来展望 五…...

【TB作品】msp430f5529单片机,dht22,烟雾传感器

功能 //硬件:msp430f5529、dht22、LCD1602、蜂鸣器、烟雾传感器、蓝牙模块。 //功能:读取温湿度、烟雾浓度显示到屏幕; //按键调节三个报警数值; //温度、湿度、烟雾浓度,任意一个大于报警数值就蜂鸣器报警&#xff1…...

uni-app全局弹窗的实现方案

背景 为了解决uni-app 任意位置出现弹窗 解决方案 一、最初方案 受限于uni-app 调用组件需要每个页面都引入注册才可以使用,此方案繁琐,每个页面都要写侵入性比较强 二、改进方案 app端:新建一个页面进行跳转,可以实现伪弹窗…...

Love-Yi情侣网站3.0存在SQL注入漏洞

目录 1. 前言 2. 网站简介 3. 寻找特征点 3.1 第一次尝试 3.2 第二次尝试 4.资产搜索 5.漏洞复现 5.1 寻找漏洞点 5.2 进行进一步测试 5.2.1 手动测试 1.寻找字段 2.寻找回显位 3.查询当前用户 5.2.2 sqlmap去跑 6.总结 1. 前言 朋友说自己建了一个情侣网站,看到…...

自然语言处理(NLP)—— 神经网络语言处理

1. 总体原则 1.1 深度神经网络(Deep Neural Network)的训练过程 下图展示了自然语言处理(NLP)领域内使用的深度神经网络(Deep Neural Network)的训练过程的简化图。 在神经网络的NLP领域: 语料…...

SHA256计算原理

标签: SHA256计算原理;SHA256;SHA-2; SHA-256计算原理 SHA-256(Secure Hash Algorithm 256-bit)是SHA-2系列中的一种哈希算法,它由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布。SHA-256主要用于数据完整性验证和数字签名等领域。以下是SHA-…...