循环链表 -- c语言实现

#pragma once
// 带头+双向+循环链表增删查改实现
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>typedef int LTDataType;typedef struct ListNode
{LTDataType data;struct ListNode* next;struct ListNode* prev;
}ListNode;//双链表申请一个新节点
ListNode* BuyListNode(LTDataType x);// 创建返回链表的头结点
ListNode* ListCreate();// 双向链表打印
void ListPrint(ListNode* pHead);// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x);// 双向链表尾删
void ListPopBack(ListNode* pHead);// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x);// 双向链表头删
void ListPopFront(ListNode* pHead);// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x);// 双向链表在pos的前面进行插入
void ListInsert(ListNode* pos, LTDataType x);// 双向链表删除pos位置的节点
void ListErase(ListNode* pos);// 双向链表销毁
void ListDestory(ListNode* pHead);//双链表申请一个新节点
ListNode* BuyListNode(LTDataType x)
{ListNode* node = (ListNode*)malloc(sizeof(ListNode));if (node == NULL){perror("BuyListNode::malloc");return NULL;}node->data = x;node->next = NULL;node->prev = NULL;return node;
}// 创建返回链表的头结点
ListNode* ListCreate()
{ListNode* head = BuyListNode(-1);head->next = head;head->prev = head;
}// 双向链表打印
void ListPrint(ListNode* pHead)
{assert(pHead);ListNode* cur = pHead->next;printf("head<=>");while (cur != pHead){printf("%d<=>", cur->data);cur = cur->next;}printf("\n");return;
}// 双向链表尾插
// void ListPushBack(ListNode* pHead, LTDataType x)
// {
// 	assert(pHead);
// 	ListNode* newnode = BuyListNode(x);
// 	ListNode* tail = pHead->prev;
// 	tail->next = newnode;
// 	newnode->prev = tail;
// 	newnode->next = pHead;
// 	pHead->prev = newnode;
// 	return;
// }
// 下面的写法更容易理解
void ListPushBack(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* newnode = BuyListNode(x);newnode->next = pHead;newnode->prev = pHead->prev;pHead->prev->next = newnode;pHead->prev = newnode;return;}// 双向链表尾删
void ListPopBack(ListNode* pHead)
{assert(pHead);ListNode* tail = pHead->prev;if (tail == pHead)return;tail->prev->next = pHead;pHead->prev = tail->prev;free(tail);tail = NULL;return;
}// 双向链表头插
// void ListPushFront(ListNode* pHead, LTDataType x)
// {
// 	assert(pHead);
// 	ListNode* newnode = BuyListNode(x);
// 	newnode->next = pHead->next;
// 	pHead->next->prev = newnode;
// 	pHead->next = newnode;
// 	newnode->prev = pHead;
// 	return;
// }void ListPushFront(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* newnode = BuyListNode(x);newnode->next = pHead->next;newnode->prev = pHead;pHead->next->prev = newnode;pHead->next = newnode;return;
}// 双向链表头删
void ListPopFront(ListNode* pHead)
{assert(pHead);ListNode* tmp = pHead->next;if (tmp == pHead)return;tmp->next->prev = pHead;pHead->next = tmp->next;free(tmp);tmp = NULL;
}// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* cur = pHead;while (cur->data != x){cur = cur->next;if (cur == pHead)return NULL;}return cur;
}// 双向链表在pos的前面进行插入
// void ListInsert(ListNode* pos, LTDataType x)
// {
// 	assert(pos);
// 	ListNode* newnode = BuyListNode(x);
// 	pos->prev->next = newnode;
// 	newnode->prev = pos->prev;
// 	pos->prev = newnode;
// 	newnode->next = pos;
// 	return;
// }
// 下面这个更好理解,且避免了pos为头节点时若头节点的 next 为 NULL 时的错误
void ListInsert(ListNode* pos, LTDataType x)
{assert(pos);ListNode* newnode = BuyListNode(x);newnode->next = pos;newnode->prev = pos->prev;pos->prev->next = newnode;pos->prev = newnode;return;
}// 双向链表删除pos位置的节点
void ListErase(ListNode* pos)
{assert(pos);pos->prev->next = pos->next;pos->next->prev = pos->prev;free(pos);pos = NULL;return;
}// 双向链表销毁
void ListDestory(ListNode* pHead)
{assert(pHead);ListNode* cur = pHead->next;while (cur != pHead){ListNode* tmp = cur->next;free(cur);cur = tmp;}free(pHead);return;
}int main() {// 创建一个双向循环链表,头节点headListNode* myList = ListCreate();// 尾插元素ListPushBack(myList, 1);ListPushBack(myList, 2);ListPushBack(myList, 3);// 头插元素ListPushFront(myList, 0);// 打印链表ListPrint(myList); // 应该输出:head<=>0<=>1<=>2<=>3<=>// 查找元素ListNode* foundNode = ListFind(myList, 2);if (foundNode != NULL) {printf("找到的节点的data: %d\n", foundNode->data); // 应该输出:Found node with value: 2} else {printf("没有找到\n");}// 在指定位置前插入元素ListInsert(foundNode, 10);// 打印链表ListPrint(myList); // 应该输出:head<=>0<=>1<=>10<=>2<=>3<=>// 删除指定位置的元素ListErase(foundNode);// 打印链表ListPrint(myList); // 应该输出:head<=>0<=>1<=>10<=>3<=>// 头删元素ListPopFront(myList);// 尾删元素ListPopBack(myList);// 打印链表ListPrint(myList); // 应该输出:head<=>1<=>2<=>// 打印 head 的 prev 的 dataprintf("head->prev->data: %d", myList->prev->data);// 销毁链表ListDestory(myList);return 0;
}

运行结果:

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

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

相关文章

ROS机械臂中Movelt!

Movelt!简介 一个易于集成使用的集成化开发平台 由一系列移动操作的功能包组成 1、运动规划 2、操作控制 3、3D感知 4、运动学 5、控制与导航算法 ....... 提供友好的GUI 可应用于工业、商业、研发和其他领域 ROS社区中使用度排名前三的功能包 Movelt!三大核心功能 …

SQL Server 存储过程中的字符串本身包含单引号的用法

文章目录 引言I 存储过程中的字符串本身包含单引号的用法1.1 问题1.2解决方法引言 使用场景: 字符串类型字段的值比较 I 存储过程中的字符串本身包含单引号的用法 在SQL Server中,单引号用于表示字符串常量。如果你的存储过程中的字符串本身包含单引号,你需要用两个连续的…

三色标记法详解

什么是三色标记法 三色标记法&#xff08;Three-color Marking&#xff09;是一种在垃圾回收&#xff08;Garbage Collection, GC&#xff09;领域广泛使用的算法&#xff0c;尤其是在Java虚拟机&#xff08;JVM&#xff09;中&#xff0c;与追踪式垃圾回收相关联。它的核心目的…

线性滤波和预测理论的新成果【1961.Kalman】翻译

线性滤波和预测理论的新成果 New Results in Linear Filtering and Prediction TheoryR. 线性滤波与预测理论的新结果[j]。 E. KALMAN Study, Baltimore, MarylandResearch Institute for AdvancedR. E.卡尔曼研究&#xff0c;巴尔的摩&#xff0c;马里兰州高级研究所。 S. …

【PX4-AutoPilot教程-TIPS】MAVROS2运行px4.launch文件报错ValueError无法启动的解决方法

MAVROS2运行px4.launch文件报错ValueError无法启动的解决方法 问题描述解决方法 环境&#xff1a; Ubuntu &#xff1a;20.04 LTS ROS &#xff1a;ROS2 Foxy PX4 &#xff1a;1.13.0 问题描述 在使用命令ros2 launch mavros px4.launch命令启动MAVROS2与PX4之间的连接时报…

函数—描述现实世界现象的基本工具(二)

在数学和物理学中&#xff0c;函数是描述现实世界现象的基本工具。通过将函数视为对象&#xff0c;数学家和物理学家能够使用代数、几何和分析的技术来研究现实世界问题。这种方法不仅提供了对现象的深入理解&#xff0c;而且也使得复杂问题的求解成为可能。在科学和工程的许多…

FL Studio20.9水果安装及切换修改中文语言教程

前言 喜欢音乐制作的小伙伴千万不要错过这个功能强大&#xff0c;安装便捷的音乐软件哦&#xff01;如果你们已经下载好了这款软件的话&#xff0c;小编今天在这里就为大家详细讲解下如何安装FL Studio软件&#xff0c;一起来学习吧&#xff01; 注意&#xff1a; &#xff0…

关于RN中Image的style下tintColor使用

React Native中Image组件的style属性下面有个tintColor 文档描述如下&#xff1a; tintColor: color Changes the color of all the non-transparent pixels to the tintColor. 改变不透明像素的颜色 比如一个白色背景页面&#xff0c;黑色icon图标&#xff0c;手机切换到暗黑…

游戏开发重要的环节

游戏开发已经成为一项技术和艺术相结合的复杂工程。成功的游戏不仅需要引人入胜的故事情节和精美的视觉效果&#xff0c;还需要无缝的技术实现和令人满意的用户体验。本文将探讨游戏开发中最关键的几个方面&#xff0c;以帮助读者更好地理解游戏开发的核心要素。 创意与设计 …

QT程序简单国际化实验

文章目录 第一步&#xff1a;新建一个QT工程第二步&#xff1a;添加控件第三步&#xff1a;在pro文件中添加内容第四步&#xff1a;更新文件第五步&#xff1a;打开QT的Linguist第六步&#xff1a;添加翻译内容第七步&#xff1a;回到QT Creator中添加文件第八步&#xff1a;给…

Python学习笔记(五)——函数和代码得复用

函数的定义与使用 函数的定义 函数是一段代码的表示&#xff0c;也是一段代码的完整封装 -函数是一段具有特定功能的、可重复使用的语句组 -函数是一种功能的抽象&#xff0c;一般函数表达特定功能 -两个作用&#xff1a;降低编码难度和代码复用 def <函数名>(<…

20230507,LIST容器

学了又忘学了又忘&#xff0c;明知道会忘又不想复习又还得学 LIST容器 1.1 基本概念 链表是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的&#xff1b;链表由一系列结点组成 结点&#xff1a;一个是存储数据元素的数据域&a…

【系统架构师】-选择题(十五)

1、实时操作系统&#xff08;RTOS&#xff09;内核与应用程序之间的接口称为&#xff08;API&#xff09; PCI是外设部件互连标准 GUI&#xff0c;图形用户界面&#xff0c;是用户与操作系统之间的接口 2、基于网络的数据库&#xff08;Netware Database&#xff0c;NDB&#x…

Offline:IQL

ICLR 2022 Poster Intro 部分离线强化学习的对价值函数采用的是最小化均方bellman误差。而其中误差源自单步的TD误差。TD误差中对target Q的计算需要选取一个max的动作&#xff0c;这就容易导致采取了OOD的数据。因此&#xff0c;IQL取消max,&#xff0c;通过一个期望回归算子…

Mybatis进阶4-权限管理

权限管理 1.权限 //相当于 职责 2.用户 //相当于 职员&#xff08;职员就职于一个职位&#xff09; 3.角色 //相当于 职位&#xff08;有多个职责&#xff09; 权限管理基础表&#xff1a;权限表&#xff0c;用户表&#xff0c;角色表 问题1&#xff1a;…

无法添加以供审核,提交以供审核时遇到意外错误。如果问题仍然存在,请联系我们

遇到问题&#xff1a; 无法添加以供审核 要开始审核流程&#xff0c;必须提供以下项目&#xff1a; 提交以供审核时遇到意外错误。如果问题仍然存在&#xff0c;请联系我们。 解决办法&#xff1a; 修改备案号为小写&#xff0c; 例如&#xff1a;京ICP备2023013223号-2A 改…

自己动手为wordpress注册一个Carousel轮播区块

要为WordPress注册一个Carousel轮播区块&#xff0c;你可以创建一个自定义Gutenberg块。以下是一个简单的示例&#xff0c;说明如何创建一个Carousel轮播区块&#xff1a; 1. 在你的主题目录中创建一个名为carousel-block的子文件夹。在这个文件夹中&#xff0c;创建一个名为c…

NumPy及Matplotlib基本用法

NumPy及Matplotlib基本用法 导语NumPy导入与生成算术运算N维数组广播元素访问 Matplotlib简单图案绘制多函数绘制图像显示参考文献 导语 深度学习中经常需要对图像和矩阵进行操作&#xff0c;好在python提供了Numpy和Matplotlib库&#xff0c;前者类似一个已经定义的数组类&am…

Error Code: 1449. The user specified as a definer (‘admin‘@‘%‘) does not exist

前言 在进行MySQL数据库迁移或存储过程部署时&#xff0c;您可能会遇到错误 [Err] 1449 - The user specified as a definer (admin%) does not exist。这篇文章将为您提供一个详细的解决方案&#xff0c;帮助您顺利解决这一问题。 错误背景 此错误通常发生在尝试执行一个存…

扫描反代Cloudflare的IP 给网站CDN加速 免费制作自己的CDN加速

Cloudflare的CDN系统基本上每个站长都家喻户晓&#xff0c;大家都知道大陆对于搭建网站的审核力度&#xff0c;以至于Cloudflare并没有大陆的泛播节点&#xff0c;有也是只有香港节点。但是这些节点对于海外是加速效果&#xff0c;对于大陆就是一个字慢&#xff0c;晚高峰的情况…