带头双向循环链表

目录

一、结构定义

二、结点创建

三、头结点初始化

四、链表打印 

五、尾插

六、头插

七、尾删

八、头删

九、查找(返回结点)

十、任意位置插入

十一、任意位置删除

十二、利用LTInsert写尾插函数

十三、利用LTInsert写头插函数

十四、利用LTErase写尾删函数

十五、利用LTErase写头删函数

十六、销毁链表 

十七、测试代码


一、结构定义

//带头双向循环链表的结构定义
typedef int LTDataType;typedef struct ListNode {LTDataType val;struct LTNode* next;struct LTNode* prev;
}LTNode;

二、结点创建

//带头双向循环链表结点创建
LTNode* CreateLTNode(LTDataType x)
{LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));if (newnode == NULL){perror("malLoc fail:");exit(-1);}newnode->val = x;newnode->next = NULL;newnode->prev = NULL;return newnode;
}

三、头结点初始化

//带头双向循环链表的初始化
LTNode* LTInit(LTNode* phead)
{phead = CreateLTNode(-1);phead->next = phead;phead->prev = phead;return phead;
}

四、链表打印 

//带头双向循环链表的打印
void LTPrint(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){printf("%d<=>", cur->val);cur = cur->next;}printf("\n");
}

五、尾插

//带头双向循环链表的尾插
void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = CreateLTNode(x);LTNode* tail = phead->prev;//尾指针//尾插tail->next = newnode;newnode->prev = tail;newnode->next = phead;phead->prev = newnode;}

六、头插

//带头双向循环链表的头插
void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = CreateLTNode(x);LTNode* first = phead->next;newnode->next = first;first->prev = newnode;phead->next = newnode;newnode->prev = phead;
}

七、尾删

//带头双向循环链表的尾删
void LTPopBack(LTNode* phead)
{assert(phead);assert(phead->next != phead);//空链表不能删LTNode* tail1 = phead->prev;//尾1结点LTNode* tail2 = tail1->prev;//尾2结点tail2->next = phead;phead->prev = tail2;free(tail1);tail1 = NULL;
}

八、头删

//带头双向循环链表的头删
void LTPopFront(LTNode* phead)
{assert(phead);assert(phead->next != phead);//空链表不能删LTNode* first = phead->next;LTNode* second = first->next;free(first);first = NULL;phead->next = second;second->prev = phead;}

九、查找(返回结点)

//带头双向循环链表的查找
LTNode* LTFind(LTNode* phead, LTDataType x)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){if (cur->val == x)return cur;elsecur = cur->next;}return NULL;
}

十、任意位置插入

如果插入位置是哨兵位,那么相当于尾插

如果插入位置是哨兵位的后一结点,那么相当于头插

//带头双向循环链表的任意位置插入
void LTInsert(LTNode* pos, LTDataType x)
{assert(pos);//插入位置必须有效LTNode* newnode = CreateLTNode(x);LTNode* posPrev = pos->prev;newnode->next = pos;pos->prev = newnode;posPrev->next = newnode;newnode->prev = posPrev;
}

十一、任意位置删除

如果删除位置是哨兵位的后一结点,那么相当于头删

如果删除位置是哨兵位的前一结点,那么相当于尾删

//带头双向循环链表的任意位置删除
void LTErase(LTNode* pos)
{assert(pos);LTNode* posPrev = pos->prev;LTNode* posNext = pos->next;posPrev->next = posNext;posNext->prev = posPrev;free(pos);
}

十二、利用LTInsert写尾插函数

//利用LTInsert写尾插函数
void LTPushBackInsert(LTNode* phead, LTDataType x)
{assert(phead);LTInsert(phead, x);
}

十三、利用LTInsert写头插函数

//利用LTInsert写头插函数
void LTPushFrontInsert(LTNode* phead, LTDataType x)
{assert(phead);LTInsert(phead->next, x);
}

十四、利用LTErase写尾删函数

//利用LTErase写尾删函数
void LTPopBackErase(LTNode* phead)
{assert(phead->next != phead);//链表为空不能删除LTErase(phead->prev);
}

十五、利用LTErase写头删函数

//利用LTErase写头删函数
void LTPopFrontErase(LTNode* phead)
{assert(phead->next != phead);LTErase(phead->next);
}

十六、销毁链表 

//销毁带头双向循环链表
void LTDestroy(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){LTNode* tmp = cur;cur = cur->next;free(tmp);}free(phead);
}

十七、测试代码

void test01()
{//初始化哨兵位LTNode* plist = NULL;plist = LTInit(plist);//LTNode* plist = LTInit(plist);//尾插LTPushBack(plist, 1);LTPushBack(plist, 2);LTPushBack(plist, 3);LTPushBack(plist, 4);LTPushBack(plist, 5);LTPushBack(plist, 6);//头插LTPushFront(plist, 1);LTPushFront(plist, 2);LTPushFront(plist, 3);LTPushFront(plist, 4);LTPushFront(plist, 5);LTPushFront(plist, 6);//打印LTPrint(plist);//尾删LTPopBack(plist);LTPopBack(plist);LTPopBack(plist);//打印LTPrint(plist);//头删LTPopFront(plist);LTPopFront(plist);LTPopFront(plist);//打印LTPrint(plist);//查找值为2的结点并在该位置插入值为10的结点LTNode* pos1 = LTFind(plist, 2);LTInsert(pos1, 10);//打印LTPrint(plist);//查找值为3的结点并删除该结点LTNode* pos2 = LTFind(plist, 3);LTErase(pos2);//打印LTPrint(plist);//尾插LTPushBackInsert(plist, 1);LTPushBackInsert(plist, 2);LTPushBackInsert(plist, 3);LTPushBackInsert(plist, 4);//打印LTPrint(plist);//头插LTPushFrontInsert(plist, 1);LTPushFrontInsert(plist, 2);LTPushFrontInsert(plist, 3);LTPushFrontInsert(plist, 4);//打印LTPrint(plist);//尾删LTPopBackErase(plist);LTPopBackErase(plist);LTPopBackErase(plist);//打印LTPrint(plist);//头删LTPopFrontErase(plist);LTPopFrontErase(plist);LTPopFrontErase(plist);//打印LTPrint(plist);//销毁链表//LTDestroy(plist);//plist=NULL;}int main()
{test01();return 0;
}

 

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

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

相关文章

pipeline + node +jenkins+kubernetes部署yarn前端项目

1、编写Dockerfile文件 # Set the base image FROM node:16.10.0# WORKDIR /usr/src/app/ WORKDIR /home/option# Copy files COPY ./ /home/option/# Build arguments LABEL branch${BRANCH} LABEL commit${COMMIT} LABEL date${BUILD_DATE} ARG ENV# Set ENV variables ENV …

视频封装格式

FLV&#xff08;Flash Video&#xff09; FLV封装格式 Tag Data分为Audio&#xff0c;Video&#xff0c;Script三种 TS&#xff08;Transport Stream&#xff09;传输流 TS文件分为三层&#xff0c;&#xff08;倒叙更好理解&#xff09; TS层&#xff1a;在PES层基础上加入…

Leetcode——岛屿的最大面积

1. 题目链接&#xff1a;695. 岛屿的最大面积 2. 题目描述&#xff1a; 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都…

Moto edge s pro手机 WIFI和蓝牙连接不上 解决方法分享

2021年12月入手一台Moto Edge S Pro 12256版&#xff0c;看着性价比很高&#xff0c;越用越垃圾。屏幕显示没有vivo亮丽/APP图标很丑/屏幕上一点点水就失灵/拍照片边缘是模糊的/系统几乎不更新。 以上都可以忍受&#xff0c;但是&#xff1a; 用一年不到&#xff0c;蓝牙不能…

前端 vue 面试题 (一)

文章目录 v-if,v-show差别v-for和v-if虚拟dom解决什么问题vue的data为什么返回函数不返回对象比较vue&#xff0c;reactvue双向绑定原理vue虚拟dom 的diff算法vue 虚拟dom的diff算法的时间复杂度vue2与vue3的区别vue数据缓存&#xff0c;避免重复计算单页应用怎么跨页面传参vue…

Java 设计模式——中介者模式

目录 1.概述2.结构3.案例实现3.1.抽象中介类3.2.抽象同事类3.3.具体同事类3.4.具体中介类3.5.测试 4.优缺点5.使用场景 1.概述 &#xff08;1&#xff09;一般来说&#xff0c;同事类之间的关系是比较复杂的&#xff0c;多个同事类之间互相关联时&#xff0c;他们之间的关系会…

Python爬取股票交易数据代码示例及可视化展示。

文章目录 前言一、开发环境二、第三方模块三、爬虫案例步骤四、爬虫程序全部代码1.分析网页2.导入模块3.请求数据4.解析数据5.翻页6.保存数据 五、实现效果六、数据可视化全部代码1.导入数据2.读取数据3.可视化图表4.效果展示关于Python技术储备一、Python所有方向的学习路线二…

Windows本地配置带GPU的Pytorch环境

首先需要安装并配置好Anaconda环境&#xff0c;安装教程教程随便找一个就好。 第一步&#xff1a;安装好之后创建conda虚拟环境&#xff1a; conda create -n your_env_name pythonx.x 第二步&#xff1a;安装需要版本的pytorch&#xff1a;pytorch下载链接 cu100/torch-1.2…

VUE基础的一些总结

首先推荐观看VUE官方文档 目录 创建一个 Vue 应用 要创建一个 Vue 应用&#xff0c;你需要按照以下步骤操作&#xff1a; 步骤 1&#xff1a;安装 Node.js 和 npm 确保你的计算机上已经安装了 Node.js。你可以在 Node.js 官网 上下载并安装它。安装完成后&#xff0c;npm&…

小黑完成了最后一节健身课,顺利完成了跳绳比赛,乘飞机到达南京准备第二天领物资和南京城内闲逛的leetcode之旅:215. 数组中的第K个最大元素

小黑代码 class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:# 数组长度n len(nums)nums list(map(lambda x:-x, nums))q []for i in range(n):heapq.heappush(q, nums[i])# 出堆target -1for i in range(k):target heapq.heappop(q)return -…

Java Web——TomcatWeb服务器

目录 1. 服务器概述 1.1. 服务器硬件 1.2. 服务器软件 2. Web服务器 2.1. Tomcat服务器 2.2. 简单的Web服务器使用 1. 服务器概述 服务器指的是网络环境下为客户机提供某种服务的专用计算机&#xff0c;服务器安装有网络操作系统和各种服务器的应用系统服务器的具有高速…

《向量数据库指南》——2023云栖大会现场,向量数据库Milvus Cloud成关注焦点

近期,广受关注的2023 云栖大会正式收官,来自全球各地的开发者集聚一堂,共同探索 AI 时代的更多可能性。 云栖大会是由阿里巴巴集团主办的科技盛宴,是中国最早的开发者创新展示平台。据悉,今年云栖大会的主题为“计算,为了无法计算的价值”,共吸引了全球 44 个国家和地区…

Qt DragDrop拖动与放置

本文章从属于 Qt实验室-CSDN博客系列 拖放操作包括两个动作&#xff1a;拖动(drag)和放下(drop或称为放置)。 拖动允许 对于要拖出的窗口或控件&#xff0c;要setDragEnabled(true) 对于要拖入的窗口或控件&#xff0c;要setAcceptDrops(true) 下面以一个具体的用例进行说…

Neo4j数据库介绍及简单使用

图数据库介绍 图数据库是一种专门设计用于存储和管理图形数据的数据库类型。在图数据库中&#xff0c;数据以图的形式表示&#xff0c;其中节点表示实体&#xff0c;边表示实体之间的关系。这种表示方式非常适合处理具有复杂关系的数据&#xff0c;如社交网络、推荐系统、网络…

2023数据结构期中测验-2023秋-计算机+未来网络专业

数据结构期中测验 选择题函数题6-1 求链式表的表长6-2 逆序数据建立链表6-3 删除单链表偶数节点6-4 求二叉树高度6-5 先序输出叶结点 为了防止不自觉的朝答案看去&#xff0c;特意用了浅色字体 选择题 2-1 下述程序段的时间复杂度为&#xff08; &#xff09; for&#xff0…

Edge最新版本,关闭侧边栏,不需命令,更改设置就可

边栏展示 说明&#xff1a;Edge自动更新版本后&#xff08;版本 119.0.2151.58&#xff09;&#xff0c;出现了侧边栏&#xff0c;看着很不舒服&#xff0c;效果如上图 修改&#xff1a; 1、在设置找到侧栏 2、点击Copilot后&#xff0c;展示的页面中会有始终显示边栏这一开…

《洛谷深入浅出进阶篇》P3397 地毯————二维差分

上链接&#xff1a;P3397 地毯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3397 上题干&#xff1a; 题目描述 在 nn 的格子上有 m 个地毯。 给出这些地毯的信息&#xff0c;问每个点被多少个地毯覆盖。 输入格式 第一行&#xff0c;两个…

高通SDX12:ASoC 音频框架浅析

一、简介 ASoC–ALSA System on Chip ,是建立在标准ALSA驱动层上,为了更好地支持嵌入式处理器和移动设备中的音频Codec的一套软件体系。 本文基于高通SDX12平台,对ASoC框架做一个分析。 二、整体框架 1. 硬件层面 嵌入式Linux设备的Audio subsystem可以划分为Machine(板…

业务连续性:确保稳健运营的关键战略

在今天的快节奏商业环境中&#xff0c;保障业务连续性是企业成功的重要保障。业务连续性不仅仅是关于应对自然灾害或技术故障&#xff0c;更是一项战略&#xff0c;涉及组织的整体准备、规划和应对能力&#xff0c;以确保在各种情况下业务的稳健运营。 一、业务连续性的定义 业…