带头 + 双向 + 循环链表增删查改实现

目录

源码:

List.c文件:

List.h文件:

简单的测试:



很简单,没什么好说的,直接上源码。

源码:

List.c文件:

#include"DLList.h"ListNode* creadNode(LTDataType x)
{ListNode* temp = (ListNode*)malloc(sizeof(ListNode));if (temp == NULL){perror("malloc fail !\n");return -1;}temp->data = x;temp->next = NULL;temp->prev = NULL;return  temp;}// 创建返回链表的头结点.
ListNode* ListCreate()
{ListNode* temp = (ListNode*)malloc(sizeof(ListNode));if (temp == NULL){perror("malloc fail !\n");return -1;}temp->next = temp;temp->prev = temp;temp->data = 0;return  temp;
}
// 双向链表销毁
void ListDestory(ListNode* pHead)
{//头节点一定不会为空assert(pHead);if (pHead->next == pHead){free(pHead);pHead = NULL;}ListNode* cur = pHead->next;while (cur != pHead){ListNode* next = cur->next;free(cur);cur = next;}printf("销毁成功!");
}
// 双向链表打印
void ListPrint(ListNode* pHead)
{assert(pHead);if (pHead->next == pHead){printf("List is NULL!\n");exit(-1);}printf("哨兵位<=>");ListNode* cur = pHead->next;while (cur != pHead){printf("%d<=>",cur->data);cur = cur->next;}printf("\n");
}// 双向链表尾插
void ListPushBack(ListNode* pHead, LTDataType x)
{ListNode* newNode = creadNode(x);ListNode* tail = pHead->next;while (tail->next != pHead){tail = tail->next;}newNode->next = pHead;pHead->prev = newNode;tail->next = newNode;newNode->prev = tail;
}// 双向链表尾删
void ListPopBack(ListNode* pHead)
{assert(pHead);if (pHead->next == pHead){printf("List is NULL!\n");exit(-1);}ListNode* tail = pHead->prev;ListNode* prev = tail->prev;pHead->prev = prev;prev->next = pHead;free(tail);}
// 双向链表头插
void ListPushFront(ListNode* pHead, LTDataType x)
{ListNode* newNode = creadNode(x);newNode->next = pHead->next;pHead->prev = newNode;pHead->next = newNode;newNode->prev = pHead;
}
// 双向链表头删
void ListPopFront(ListNode* pHead)
{assert(pHead);if (pHead->next == pHead){printf("List is  NULL!\n");exit(-1);}ListNode* firstNode = pHead->next;ListNode* secondNode = firstNode->next;pHead->next = secondNode;secondNode->prev = pHead;free(firstNode);firstNode = NULL;
}
// 双向链表查找
ListNode* ListFind(ListNode* pHead, LTDataType x)
{assert(pHead);ListNode* cur = pHead->next;while (cur != pHead){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}
// 双向链表在pos的前面进行插入
void ListInsert(ListNode *pHead, ListNode* pos, LTDataType x)
{assert(pos);if (pos == pHead){ListPushBack(pHead,x);}ListNode* cur = pHead->next;while (cur != pHead){if (cur->data == pos->data){ListNode* prev = pos->prev;ListNode *newNode  = creadNode(x);prev->next = newNode;newNode->prev = prev;newNode->next = pos;pos->prev = newNode;return;}cur = cur->next;}
}
// 双向链表删除pos位置的节点
void ListErase(ListNode* pHead,ListNode* pos)
{assert(pHead);if (pos == pHead->next){ListPopFront(pHead);}if (pos == pHead->prev){ListPopBack(pHead);}ListNode* cur = pHead->next;while (cur != pHead){if (cur->data == pos->data){ListNode* prev = cur->prev;ListNode* next = cur->next;prev->next = next;next->prev = prev;free(cur);return;}cur = cur->next;}
}

List.h文件:

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>// 带头 + 双向 + 循环链表增删查改实现
typedef int LTDataType;
typedef struct ListNode
{LTDataType data;struct ListNode* next;struct ListNode* prev;
}ListNode;ListNode* creadNode();
// 创建返回链表的头结点.
ListNode* ListCreate();
// 双向链表销毁
void ListDestory(ListNode* pHead);
// 双向链表打印
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* pHead,ListNode* pos, LTDataType x);
// 双向链表删除pos位置的节点
void ListErase(ListNode* pHead,ListNode* pos);

简单的测试:

#include"DLList.h"void test1(ListNode * head) {ListPushBack(head, 1);ListPushBack(head, 2);ListPushBack(head, 3);ListPushBack(head, 4);ListPushBack(head, 5);ListPopBack(head);ListPrint(head);ListPopBack(head);ListPrint(head);ListPopBack(head);ListPrint(head);ListPopBack(head);ListPrint(head);ListPopBack(head);ListPrint(head);ListPopBack(head);ListPrint(head);}void test2(ListNode* head) {ListPushBack(head, 1);ListPushBack(head, 2);ListPushBack(head, 3);ListPushBack(head, 4);ListPushBack(head, 5);ListPopFront(head);ListPrint(head);
}void test3(ListNode* head) {ListPushBack(head, 1);ListPushBack(head, 2);ListPushBack(head, 3);ListPushBack(head, 4);ListPushBack(head, 5);ListFind(head,2);ListFind(head,7);ListPrint(head);
}void test4(ListNode* head) {ListPushBack(head, 1);ListPushBack(head, 2);ListPushBack(head, 3);ListPushBack(head, 4);ListPushBack(head, 5);ListInsert(head, ListFind(head, 2),10);ListInsert(head, ListFind(head, 1),10);ListInsert(head, ListFind(head, 5),10);ListInsert(head, ListFind(head, 6),10);ListPrint(head);
}void test5(ListNode* head) {ListPushBack(head, 1);ListPushBack(head, 2);ListPushBack(head, 3);ListPushBack(head, 4);ListPushBack(head, 5);ListErase(head,ListFind(head,5));ListErase(head,ListFind(head,1));ListErase(head,ListFind(head,2));ListPrint(head);
}int main()
{ListNode* head = ListCreate();//test1(head);//test2(head);//test3(head);//test4(head);test5(head);ListDestory(head);return 0;
}

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

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

相关文章

【SpringBoot篇】springboot的自动装配原理

文章目录 &#x1f3f3;️‍&#x1f308;什么是自动装配&#x1f339;SpringBoot的自动装配&#x1f354;具体操作 &#x1f3f3;️‍&#x1f308;什么是自动装配 自动装配&#xff08;Auto-Configuration&#xff09;是Spring Boot框架的一个核心特性之一&#xff0c;它通过…

分布式websocket IM聊天系统相关问题问答【第九期】

前言 上期视频讲解了自己关于聊天系统的设计的时候出现了一些不一样的声音。不了解情况的可以看上上期视频。这期主要是讨论。IM聊天系统设计方案多。我的先说明一下自己的技术背景互相之间才能更好的理解。 本期对应视频 目前已经写的文章有。并且有对应视频版本。 git项目地…

在 Linux 上搭建 Java 环境

目录 一、安装jdk 1. 挑选 jdk 版本 2. 安装 3. 验证 jdk 二、安装tomcat 1. 下载压缩包 2. 上传压缩包给 Linux &#xff08;需要用到 rz 命令&#xff09; 3. 解压压缩包&#xff08;需要用到 unzip&#xff09; 4. 进入 bin 目录 5. 给启动脚本增加可执行权限 6. 启…

k8s学习(RKE+k8s+rancher2.x)成长系列之概念介绍(一)

一、前言 本文使用国内大多数中小型企业使用的RKE搭建K8s并拉起高可用Rancher2.x的搭建方式&#xff0c;以相关技术概念为起点&#xff0c;实际环境搭建&#xff0c;程序部署为终点&#xff0c;从0到1的实操演示的学习方式&#xff0c;一步一步&#xff0c;保姆级的方式学习k8…

加载服务端发送的模型文件_unity开发进阶

加载服务端发送的模型文件 前言一、服务端搭建二、unity请求文件三、加载模型结语 前言 之前我们学习制作的都是离线状态下的东西&#xff0c;今天我们学习制作一个小demo。 内容就是我们用unity请求后台&#xff0c;接受后台发送过来的模型&#xff0c;然后将模型加载到场景中…

Mac使用adb调试安卓手机

0x00 背景 最近windows电脑休息&#xff0c;用mac办公比较多&#xff0c;手机用时间长了&#xff0c;不太灵光&#xff0c;准备修理一番。于是要用mac调试下android手机。配置略显麻烦&#xff0c;网上的步骤多参差不齐。估计是入门步骤&#xff0c;大佬们也懒得写的太细。于是…

开发微信小程序,将图片下载到相册的方法,saveImageToPhotosAlbum怎么用

在开发微信小程序的时候&#xff0c;经常能看到小程序里面有下载按钮&#xff0c;如何将小程序中的图片下载到手机相册中那&#xff0c;下面给大家说一下怎么做&#xff0c;代码如何去写。 一、到微信小程序后台开启“用户隐私保护指引” 1.进入小程序后台&#xff0c;侧拉拉到…

Unity动画桢事件

1&#xff0c;使用原因 在新项目内部审核的时候&#xff0c;说什么动画节奏不匹配&#xff0c;所以决定用动画桢事件来处理技能释放。当释放技能的时候&#xff0c;先播放技能动画&#xff0c;然后再动画桢所在的时间戳执行技能的逻辑。 2&#xff0c;具体实现 1&#xff0c;…

单调性的应用

1单调性 应用场景&#xff1a;常应用于双指针的进一步优化问题中含义&#xff1a;针对指针 i 1 > i i1>i i1>i一定有 j 1 > j j1>j j1>j或者 j 1 < j j1<j j1<j这样我们就可以利用该性质对算法进行进一步优化&#xff0c;避免一些不必要的遍历…

Linux下安装MySQL5.7的客户端

目录 1、简介 2、将软件上传到指定的位置 3、安装 3.1、centos7中是有自带MySQL数据库的&#xff0c;我们首先得先卸载它 3.2、安装 mysql-community-common-8.0.33-1.el9.x86_64.rpm 3.3、安装mysql-community-client-plugins-8.0.33-1.el7.x86_64.rpm 3.4、安装 mysq…

计算机网络自顶向下Wireshark labs1-Intro

Wireshark labs1 实验文档&#xff1a;http://www-net.cs.umass.edu/wireshark-labs/Wireshark_Intro_v8.0.pdf 介绍 加深对网络协议的理解通常可以通过观察协议的运行和不断调试协议来大大加深&#xff0c;具体而言&#xff0c;就是观察两个协议实体之间交换的报文序列&…

【通过docker安装常用软件镜像】1.镜像 2.安装 redis,jdk,nginx

1)官网镜像网站 hello-world - Official Image | Docker Hub 2)安装镜像测试例子 Redis 1.查询redis [rootlocalhost ~]# docker search redis NAME DESCRIPTION STARS OFFICIAL redis …

CSS 实现 flex布局最后一行左对齐的方案「多场景、多方案」

目录 前言解决方案场景一、子项宽度固定&#xff0c;每一行列数固定方法一&#xff1a;模拟两端对齐方法二&#xff1a;根据元素个数最后一个元素动态margin 场景二、子项的宽度不确定方法一&#xff1a;直接设置最后一项 margin-right:auto方法二&#xff1a;使用:after(伪元素…

Linux常见的管理命令

1. whoami 作用&#xff1a; 显示出当前有效的用户名称&#xff0c;Linux是多用户多任务 语法&#xff1a;whoami(选项) 选项&#xff1a; --help&#xff1a;在线帮助 --version&#xff1a;显示版本信息和退出 场景使用&#xff1a; 1. 当用户想要查看当前登录系统的用户…

EHS管理系统为何需要物联网的加持?

EHS是Environment、Health、Safety的缩写&#xff0c;是从欧美企业引进的管理体系&#xff0c;在国外也被称为HSE。EHS是指健康、安全与环境一体化的管理。 而在国内&#xff0c;整个EHS市场一共被分成三类&#xff1b; 一类是EHS管培体系&#xff0c;由专门的EHS机构去为公司…

Dlearning

Deep Learning Basic 神经网络&#xff1a; #mermaid-svg-rR22a8Udy5SxGOoP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-rR22a8Udy5SxGOoP .error-icon{fill:#552222;}#mermaid-svg-rR22a8Udy5SxGOoP .error-t…

2016年认证杯SPSSPRO杯数学建模B题(第一阶段)低分辨率下看世界全过程文档及程序

2016年认证杯SPSSPRO杯数学建模 B题 低分辨率下看世界 原题再现&#xff1a; 数码摄像技术被广泛使用于多种场合中。有时由于客观条件的限制&#xff0c;拍摄设备只能在较低的分辨率下成像。为简单起见&#xff0c;我们只考虑单色成像。假设成像的分辨率为 32 64&#xff0c…

Make.com的发送邮件功能已经登峰造极

make.com的发送邮件功能已经做到了登峰造极。 我给你个任务&#xff0c;让你发送个新邮件给谁谁&#xff0c;你一定想到SMTP服务器不就行了。 我给你第二个任务&#xff0c;我让你自动回复一个邮件&#xff0c;注意是回复。 做不到了吧&#xff5e;&#xff5e;&#xff01;…

【C++干货铺】常用的特殊类——饿汉模式和懒汉模式

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C干货铺 代码仓库&#xff1a;Gitee 目录 请设计一个类&#xff0c;不能被拷贝 请设计一个类&#xff0c;只能在堆上创建对象 请设计一个类&#xff0c;只能在栈上创建对象 请设计一个类&#xff0c;不…

HarmonyOS 鸿蒙应用开发( 六、实现自定义弹窗CustomDialog)

自定义弹窗&#xff08;CustomDialog&#xff09;可用于广告、中奖、警告、软件更新等与用户交互响应操作。开发者可以通过CustomDialogController类显示自定义弹窗。具体用法请参考自定义弹窗。 在应用的使用和开发中&#xff0c;弹窗是一个很常见的场景&#xff0c;自定义弹窗…