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

【c语言数据结构】超详细!模拟实现双向链表(初始化、销毁、头删、尾删、头插、尾插、指定位置插入与删除、查找数据、判断链表是否为空)

特点:

  • 结构:指向一结点指针+数据+指向一结点指针
  • 由于循环,尾结点的下一结点next指向头结点(哨兵结点)
  • 的双向链表只有自循环的哨兵结点(头结点) 

模拟实现双向链表

LIST.h

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>
#include<stdbool.h>//定义双向链表结构
typedef int LTDataType;//链表数据类型
typedef struct ListNode
{LTDataType data;struct ListNode* prev;struct ListNode* next;
}LTNode;//初始化
void LTInit(LTNode** pphead);
LTNode* LTInit2();//销毁    链表的销毁是整个都销毁的
void LTDesTory(LTNode** pphead);
void LTDesTory2(LTNode* phead);//传一级我们需要手动将plist置为NULL//打印链表
void LTPrint(LTNode* phead);//尾插数据
//第一个参数传一级还是二级,,要看pphead指向的节点会不会发生改变
//如果发生改变,那么pphead的改变要影响实参,传二级
//如果不发生改变,pphead不会影响实参,传一级
//我们通过传递的一级指针来找到头结点,就可以找到之后的节点了//那么我们在插入新节点的时候,受到影响的节点有之前的尾节点和哨兵位以及新节点
void LTPushBack(LTNode* phead, LTDataType x);//头插数据
void LTPushFront(LTNode* phead, LTDataType x);//尾删数据
void LTPopBack(LTNode* phead);//头删数据
void LTPopFront(LTNode* phead);//判断链表是否为空
bool LTEmpty(LTNode* phead);//查找数据
LTNode* LTFind(LTNode* phead, LTDataType x);
//在pos位置之后插入节点
void LTInsert(LTNode* pos, LTDataType x);//删除指定位置的节点
void LTIErase(LTNode* pos);

LIST.c

#define _CRT_SECURE_NO_WARNINGS 1
#include"LIST.h"//创建结点
LTNode* buyNode(LTDataType x) {LTNode* newnode = (LTNode*)malloc(sizeof(LTNode*));if (newnode == NULL) {perror("malloc fail!");exit(1);}newnode->data = x;newnode->next = newnode->prev = newnode;//初步实现双头自循环的空链表return newnode;
}
//初始化1 传参初始化
void LTInit(LTNode** pphead) {//创建一个哨兵结点(头结点)*pphead = buyNode(-1);
}
//初始化2 返回值初始化
LTNode* LTInit2() {LTNode* phead = buyNode(-1);return phead;
}//销毁    链表的销毁是整个都销毁的
void LTDesTory(LTNode** pphead) {//哨兵位不能先销毁!assert(pphead && *pphead);LTNode* pcur = (*pphead)->next;//从哨兵位的下一结点开始遍历销毁while (pcur != (*pphead)) {LTNode* Next = pcur->next;//创建pcur下一结点,方便遍历销毁free(pcur);pcur = Next;}//跳出循环,说明哨兵位之后的全销毁了//现在释放销毁哨兵位free(*pphead);*pphead = pcur = NULL;
}//初次错误示范!!
void LTDesToryError(LTNode** pphead) {LTNode* pcur = (*pphead)->next;LTNode* Next = pcur->next;while (pcur!=*pphead) {free(pcur);pcur = Next;Next = Next->next;}pcur = Next = NULL;
}//void LTDesTory2(LTNode* phead);//传一级我们需要手动将plist置为NULL//打印链表
void LTPrint(LTNode* phead) {LTNode* pcur = phead->next;//记住第一个结点!!是哨兵位下一个结点!while (pcur != phead) {printf("%d->", pcur->data);pcur = pcur->next;}printf("\n");
}//尾插数据
//第一个参数传一级还是二级,,要看pphead指向的节点会不会发生改变
//如果发生改变,那么pphead的改变要影响实参,传二级
//如果不发生改变,pphead不会影响实参,传一级
//我们通过传递的一级指针来找到头结点,就可以找到之后的节点了//那么我们在插入新节点的时候,受到影响的节点有之前的尾节点和哨兵位以及新节点
void LTPushBack(LTNode* phead, LTDataType x) {assert(phead);//哨兵位 phead 新结点 newnode 尾结点pcur(phead->prev)LTNode* pcur = phead->prev;LTNode* newnode = buyNode(x);//newnode的指针修改,prev指向上个尾节点,next指向哨兵位newnode->prev = pcur;newnode->next = phead;//原先的尾节点next指针->哨兵位,现在next->newnode//哨兵位的prev原本->尾节点,现在让prev->newnodepcur->next = newnode;phead->prev = newnode;
}//头插数据
void LTPushFront(LTNode* phead, LTDataType x) {assert(phead);//哨兵位phead 新结点newnode 第一个结点 pcur(phead->next)LTNode* newnode = buyNode(x);LTNode* pcur = phead->next;//插入newnode,prev指向哨兵位,next指向pcurnewnode->prev = phead;newnode->next = pcur;//哨兵位的next,原头结点的prev,分别指向newnodephead->next = newnode;pcur->prev = newnode;
}
//————————ERROR!!注意!!!删除要检查链表是否为空!!——————————
//判断链表是否为空
bool LTEmpty(LTNode* phead) {assert(phead);//error!!! return phead == NULL;不是判断哨兵位phead!!第一个结点是哨兵位下一结点!phead->next!return phead->next == phead;//如果哨兵位next指向自己,说明是自循环的只有哨兵位的空链表!
}//链表为空,返回true
//尾删数据
void LTPopBack(LTNode* phead) {assert(phead);//哨兵位不得为空assert(!LTEmpty(phead));//链表不得为空//哨兵位phead 尾结点 del(phead->prev) 尾结点前一结点 del->prevLTNode* del = phead->next;//删除尾结点 哨兵位的prev指向del->prev, 尾结点的前一结点的next->哨兵位del->prev->next = phead;//注意这俩行代码不可调换!phead->prev = del->prev;//先改了头结点的指向 del也会跟着改!//删除完之后释放delfree(del);del = NULL;
}//头删数据
void LTPopFront(LTNode* phead) {assert(phead);assert(!LTEmpty(phead));//哨兵位phead 要删除的第一个结点del(phead->next) 新的第一结点del->nextLTNode* del = phead->next;//删除结点 哨兵位的next指向新第一结点 新的第一结点的prev指向哨兵位del->next->prev = phead;phead->next = del->next;//释放delfree(del);del = NULL;
}//查找数据
//遍历链表,直至再次遇到哨兵位(找一圈了没找到就是没有)
LTNode* LTFind(LTNode* phead, LTDataType x) {LTNode* pcur = phead->next;//记住从第一个结点!不是phead!while (pcur != phead) {//找到了if (pcur->data == x) {return pcur;}pcur = pcur->next;}//遍历循环找了一圈,没找到return NULL;
}
//在pos位置之后插入节点
void LTInsert(LTNode* pos, LTDataType x) {//创建一个新结点LTNode* newnode = buyNode(x);//pos newnode pos->next//先安newnodenewnode->next = pos->next;newnode->prev = pos;//先连接pos后面的,再连pospos->next->prev = newnode;pos->next = newnode;
}//删除指定位置的节点
void LTIErase(LTNode* pos) {assert(pos);//传过来的位置不为空/*pos前面的节点pos->prevpos后面的节点pos->next删除pos影响这两个节点pos前面指针的节点的next指针->Pos后面的节点pos后面的节点的prev指针就->pos前面的节点*///pos->prev pos pos->nextpos->prev->next = pos->next;pos->next->prev = pos->prev;free(pos);pos = NULL;
}

相关文章:

【c语言数据结构】超详细!模拟实现双向链表(初始化、销毁、头删、尾删、头插、尾插、指定位置插入与删除、查找数据、判断链表是否为空)

特点&#xff1a; 结构&#xff1a;指向前一结点指针数据指向后一结点指针由于循环&#xff0c;尾结点的下一结点next指向头结点&#xff08;哨兵结点&#xff09;空的双向链表只有自循环的哨兵结点&#xff08;头结点&#xff09; 模拟实现双向链表 LIST.h #define _CRT_…...

第十四届蓝桥杯嵌入式国赛

一. 前言 本篇博客主要讲述十四届蓝桥杯嵌入式的国赛题目&#xff0c;包括STM32CubeMx的相关配置以及相关功能实现代码以及我在做题过程中所遇到的一些问题和总结收获。如果有兴趣的伙伴还可以去做做其它届的真题&#xff0c;可去 蓝桥云课 上搜索历届真题即可。 二. 题目概述 …...

(k8s)kubernetes集群基于Containerd部署

资源列表 基础环境 一、基础环境准备 1.1、关闭Swap分区 1.2、添加hosts解析 1.3、桥接的IPv4流量传递给iptables的链 二、准备Containerd容器运行时 2.1、安装Containerd 2.2、配置Containerd 2.3、启动Containerd 三、部署Kubernetes集群 3.1、安装Kubeadm工具 3.2、…...

python内置模块pathlib.Path类操作目录和文件

python自带的pathlib模块提供了很多路径相关的功能&#xff0c;而pathlib.Path 是pathlib 模块中的一个核心类&#xff0c;它代表了文件系统中的一个路径&#xff0c;实现功能比如创建、删除、移动文件&#xff0c;读取和写入文件内容&#xff0c;遍历目录等。 Path 类跟os.pa…...

react开发环境搭建

文章目录 准备工作创建 React 项目使用 create-react-app 创建 React 项目使用 Vite 创建 React 项目启动项目效果安装出现的情况 react项目文件讲解1. 项目根目录2. 其他可能的目录和文件3. 配置文件 准备工作 Node.js 安装方法&#xff1a; 方式一&#xff1a;使用 NVM 安装…...

python 逻辑语句简记

什么语言都少不了逻辑处理语句的使用&#xff0c;python的逻辑处理语句有自身的使用特点&#xff0c;稍稍总结记录一下 一、断言 assert 条件 条件触发&#xff0c;程序执行中断 二、条件语句 if 条件&#xff1a; 执行内容 三、循环语句 while 条件&#xff1a; 循环体…...

8.进销存系统(基于springboot的进销存系统)

目录 1.系统的受众说明 2.开发技术与环境配置 2.1 SpringBoot框架 2.2 Java语言简介 2.3 MySQL环境配置 2.4 idea介绍 2.5 mysql数据库介绍 2.6 B/S架构 3.系统分析与设计 3.1 可行性分析 3.1.1 技术可行性 3.1.2 操作可行性 3.1.3经济可行性 3.4.1 数据库…...

深入理解主键回显:提升数据操作效率与准确性

在软件开发的世界中&#xff0c;主键回显是一个常常被提及但又容易被忽视其重要性的概念。今天&#xff0c;我们就来深入探讨一下主键回显的奥秘。 一、什么是主键回显&#xff1f; 在数据库设计中&#xff0c;主键是用于唯一标识表中每一行记录的字段。而主键回显&#xff0…...

springboot+阿里云物联网教程

需求背景 最近有一个项目,需要用到阿里云物联网,不是MQ。发现使用原来EMQX的代码去连接阿里云MQTT直接报错,试了很多种方案都不行。最终还是把错误分析和教程都整理一下。 需要注意的是,阿里云物联网平台和MQ不一样。方向别走偏了。 概念描述 EMQX和阿里云MQTT有什么区别…...

QT Creator cmake 自定义项目结构, 编译输出目录指定

1. 目的 将不同的源文件放到不同的目录下进行管理&#xff0c; 如下&#xff1a; build: 编译输出目录 include: 头文件目录 rsources: 资源文件目录 src: cpp文件目录 2. 创建完cmake工程后修改CMakeLists.txt 配置 注 &#xff1a; 这里头文件目录是include, 所以在includ…...

lunar无第三方依赖的公历、农历、法定节假日...日历工具库

文章目录 介绍maven示例示例&#xff08;前后端&#xff09;网址文档 介绍 lunar是一款无第三方依赖的公历(阳历)、农历(阴历、老黄历)、道历、佛历工具&#xff0c;支持星座、儒略日、干支、生肖、节气、节日、彭祖百忌、吉神(喜神/福神/财神/阳贵神/阴贵神)方位、胎神方位、…...

(全网最细)ELF文件详解

ELF文件是什么 ELF文件是一种对象文件格式。ELF文件的全程是&#xff08;Executeable and Linking Format&#xff0c;可执行可链接格式&#xff09;。ELF文件格式主要有三种&#xff1a; 可重定向文件。可重定向文件就是可以用于和其他对象文件链接来创建一个可执行或者可分…...

Leetcode面试经典150题-39.组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如…...

海外云市场分析

海外云市场数据洞察 2024 H1 季度数据 H1季度,全球云基础设施服务指数同比增长21%,达到798亿美元 (相比去年增加134亿美元),三大云服务提供商— AWS,微软Azure 和GCP 营收总增长率为24%,占总市场66%。 其中三大云厂商同比营收增长排序(2024 H1):微软 31%,G…...

显示和隐藏图片【JavaScript】

使用 JavaScript 来实现显示和隐藏图片。下面是一个简单的示例&#xff0c;展示如何通过按钮点击来切换图片的可见性。 实现效果: 代码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name&…...

Java调用数据库 笔记06 (修改篇)

1.创建Java的普通class类 2.加载驱动 Class.forName("com.mysql.jdbc.Driver"); 3.驱动管理类调用方法进行连接&#xff0c;得到连接对象 DriverManager.getConnection(url, user, password); 其中设置参数&#xff1a; static final String url "jdbc:my…...

virtualbox中的网络模式,网络设置,固定IP

virtualbox关于网络设置的文档&#xff1a;https://www.virtualbox.org/manual/topics/networkingdetails.html#networkingdetails DHCP Dynamic Host Configuration Protocol&#xff1a;动态主机配置协议&#xff0c;是专门用来给网络中的节点分发IP地址&#xff0c;确保每…...

2025年最新大数据毕业设计选题-Hadoop综合项目

选题思路 回忆学过的知识(Python、Java、Hadoop、Hive、Sqoop、Spark、算法等等。。。) 结合学过的知识确定大的方向 a. 确定技术方向&#xff0c;比如基于Hadoop、基于Hive、基于Spark 等等。。。 b. 确定业务方向&#xff0c;比如民宿分析、电商行为分析、天气分析等等。。。…...

实战C++手写线程池

课程总目录 文章目录 一、项目必备基础概念1.1 并发和并行1.2 多线程的优势1.3 线程的消耗1.4 线程池的优势1.5 线程池的两种模式:fixed模式和cached模式1.6 线程同步之线程互斥1.7 线程同步之线程通信1.7.1 条件变量1.7.2 信号量1.8 项目设计图浏览二、线程池代码展示三、线程…...

Alluxio Enterprise AI on K8s FIO 测试教程

Alluxio Enterprise AI on K8s FIO 测试视频教程 视频为Alluxio Enterprise AI on K8s FIO测试视频教程。fio是业内常用的磁盘与文件系统性能测试工具&#xff0c;下面内容将通过文字方式介绍Alluxio on k8s 进行fio测试的教程。 1. 测试环境 虚拟机规格&#xff1a;ecs.g3i.…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...