C语言进阶|双链表

✈链表的分类

链表的结构非常多样,以下情况组合起来就有8种(2x2×2)链表结构:

虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:单链表和双向带头循环链表

1.无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。

2.带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个结构虽然结构复杂,但是使用代码实现以后会发现结构会带来很多优势,实现反而简单了,后面我们代码实现了就知道了。 

 ✈双链表

🚀双链表头文件:

//头文件
#include<stdio.h>
#include<malloc.h>
#include<assert.h>
typedef int LTDataType;
typedef struct ListNode
{struct ListNode* next; //指针保存下一个节点的地址struct ListNode* prev; //指针保存前一个节点的地址LTDataType data;
}LTNode;//初始化链表
LTNode* LTInit();
//销毁链表
void LTDestroy(LTNode* phead);
//查看链表
void LTPrint(LTNode* phead);
//头插/删,尾插/删
void LTPushBack(LTNode* phead, LTDataType x);
void LTPopBack(LTNode* phead);
void LTPushFront(LTNode* phead, LTDataType x);
void LTPopFront(LTNode* phead);
//在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x);
//删除pos数据
void LTErase(LTNode* pos);
//查找数据
LTNode* LTFind(LTNode* phead, LTDataType x);

🚀创建节点

//节点的创建
LTNode* LTBuyNode(int x)
{LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));if (newnode == NULL){perror("malloc error");}newnode->next = newnode->prev = newnode;newnode->data = x;return newnode;
}

🚀双链表的初始化

//双链表的初始化
LTNode* LTInit()
{LTNode* phead = LTBuyNode(-1);return phead;
}

🚀查看双链表

//查看双链表
void LTPrint(LTNode* phead)
{assert(phead);LTNode* tmp = phead->next;while (tmp != phead){printf("%d->", tmp->data);tmp = tmp->next;}printf("\n");
}

🚀尾插

//尾插
void LTPushBack(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);LTNode* pre = phead->prev;pre->next = newnode;newnode->prev = pre;phead->prev = newnode;newnode->next = phead;
}

🚀尾删

//尾删
void LTPopBack(LTNode* phead)
{assert(phead);assert(phead->next != phead);LTNode* pre = phead->prev->prev;free(phead->prev);phead->prev = pre;pre->next = phead;
}

🚀头插

//头插
void LTPushFront(LTNode* phead, LTDataType x)
{assert(phead);LTNode* newnode = LTBuyNode(x);LTNode* next = phead->next;phead->next = newnode;newnode->prev = phead;next->prev = newnode;newnode->next = next;
}

🚀头删

//头删
void LTPopFront(LTNode* phead)
{assert(phead);assert(phead->next != phead);LTNode* del = phead->next;LTNode* next = del->next;phead->next = next;next->prev = phead;free(del);del = NULL;
}

🚀在pos之后插入数据

//在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x)
{LTNode* next = pos->next;LTNode* newnode = LTBuyNode(x);pos->next = newnode;newnode->prev = pos;next->prev = newnode;newnode->next = next;
}

🚀删除pos数据 

//删除pos数据
void LTErase(LTNode* pos)
{assert(pos);LTNode* pre = pos->prev;LTNode* next = pos->next;pre->next = next;next->prev = pre;free(pos);pos = NULL;
}

🚀查找数据 

//查找数据
LTNode* LTFind(LTNode* phead, LTDataType x)
{assert(phead);LTNode* tmp = phead->next;while (tmp != phead){if (tmp->data == x){return tmp;}tmp = tmp->next;}return NULL;
}

🚀销毁链表 

//销毁链表
void LTDestroy(LTNode* phead)
{assert(phead);LTNode* tmp = phead->next;while (tmp != phead){LTNode* pre = tmp->next;free(tmp);tmp = pre;}free(phead);tmp = NULL;phead = NULL;
}

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

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

相关文章

【学习AI-相关路程-工具使用-NVIDIA SDK MANAGER==NVIDIA-jetson刷机工具安装使用 】

【学习AI-相关路程-工具使用-NVIDIA SDK manager-NVIDIA-jetson刷机工具安装使用 】 1、前言2、环境配置3、知识点了解&#xff08;1&#xff09;jetson 系列硬件了解&#xff08;2&#xff09;以下大致罗列jetson系列1. Jetson Nano2. Jetson TX23. Jetson Xavier NX4. Jetson…

4月25日 C++day3

#include <iostream> using namespace std;class Person {const string name;int age;char sex; public:Person():name("lisi"){cout << "Person无参构造" << endl;}Person(string name,int age,char sex):name(name),age(age),sex(sex)…

数字电路-5路呼叫显示和8路抢答器

本内容涉及两个电路&#xff0c;分别为5路呼叫显示电路和8路抢答器电路&#xff0c;包含Multisim仿真原文件&#xff0c;为掌握FPGA做个铺垫。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、5路呼叫显…

排序算法大总结

引言 排序算法&#xff08;sorting algorithm&#xff09;是用于对一组数据按照特定顺序进行排列。排序算法有着广泛的应用&#xff0c;因为有序数据通常能够被更高效地查找、分析和处理。 如图 1-1 所示&#xff0c;排序算法中的数据类型可以是整数、浮点数、字符或字符串等…

中伟视界:矿山智能管控平台关键功能介绍,AI算法、告警通知、问题解决

矿山智能管控平台的关键功能介绍如下&#xff1a; 1.1. 主界面功能介绍 主界面分为六大区域&#xff0c;分别是设备列表、重点区域、功能区、告警列表、菜单区等&#xff0c;分别对应不同的功能和操作。 1.2. 平台功能 平台包含11条特色功能&#xff0c;分别为&#xff1a…

Android 11 裁剪系统显示区域(适配异形屏)

概述 在显示技术中&#xff0c;"OverScan"&#xff08;超扫描&#xff09;是一种调整显示图像边界的技术。通常情况下&#xff0c;OverScan 会在显示屏的边缘周围裁剪一小部分图像。这种裁剪是为了确保显示内容在屏幕上的完整可见性&#xff0c;尤其是在老式电视或投…

设备能源数据采集新篇章

在当今这个信息化、智能化的时代&#xff0c;设备能源数据的采集已经成为企业高效运营、绿色发展的重要基石。而今天&#xff0c;我们要向大家介绍的就是一款颠覆传统、引领未来的设备能源数据采集神器——HiWoo Box网关&#xff01; 一、HiWoo Box网关&#xff1a;一站式解决…

广州华夏家博会盛大开幕,家居建材行业迎来新篇章

5月3日&#xff0c;备受瞩目的广州华夏家博会在广州琶洲会展中心盛大开幕。本次家博会汇聚了众多家居建材行业的知名品牌和优质产品&#xff0c;吸引了来自全国各地的专业观众和消费者前来参观。 作为家居建材行业的盛会&#xff0c;广州华夏家博会不仅是一个展示最新产品和技术…

Unity Timeline学习笔记(4) - 自定义轨道OnCreateClip和CreateTrackMixer用法上的区分

前面我们第二篇文章Unity Timeline学习笔记(2) - PlayableTrack是一个初步的PlayableTrack使用方法&#xff0c;有时候可能会个性化定制专属轨道。 OnCreateClip的例子 下面我们做一个例子&#xff1a; 首先是轨道 //FeatureTrack.cs using System.ComponentModel; using U…

AutoMQ 系统测试体系揭秘

01 前言 Apache Kafka 有着比较完备的自测体系。除了常规的单元测试和集成测试以外&#xff0c;Apache Kafka 还有着 1000 的“系统集成和性能测试”&#xff08;以下简称系统测试&#xff09;。系统测试会拉起一套真实的 Kafka 集群&#xff0c;并模拟用户使用 Kafka 集群的方…

《XXL_job技术文档》-分布式任务调度框架-双方式部署-tar.gz安装/docker安装

阿丹&#xff1a; 作为任务调度的使用&#xff0c;xxl_job是经常使用的&#xff0c;可以帮助程序员或者其他业务的定时任务变的可控。但是很多教程都是通过压缩包来进行运行和部署的&#xff0c;但是现在更多的都是将模块容器化。本文章一次性整理。 XXL-Job是一款开源的分布式…

计算机视觉大项目(1)-水果分级系统

项目来源&#xff1a;河北大学计算机视觉课程-杨老师. 一共有四个标题&#xff0c;本篇博客只完成前两问。 目录 实验目的: 实验内容&#xff1a; 实验步骤&#xff1a; 1.水果图像的分割 >掩膜图像Mask 是什么&#xff1f; >改进:去除反光部分的影响 2&#xf…