数据结构---双链表

news/2024/10/18 8:25:02/

之前我们已经了解并实现了单链表,我们发现单链表实现头插头删还行,但是尾插尾删什么的需要遍历链表,使得时间复杂度增加,效率不是那么好,那么有没有改进的办法呢?

今天,我们就来了解并实现一下双链表。

我们知道,单链表是有一个结构体指针指向下一个节点,如图:

那么双链表,顾名思义,指针指向双向,两个结构体指针,分别指向下一个节点和前一个节点。 

接下来就来实现双链表:

新建一个头文件:List.h

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>typedef int LTDataType;//定义数据类型,方便后期修改
typedef struct ListNode {struct ListNode* prev;struct ListNode* next;LTDataType data;
}LTNode;void ListPrint(LTNode* pos);//打印链表用于测试LTNode* BuyListNode(LTDataType x);//开辟一个节点,返回节点地址LTNode* ListInit();//初始化链表void ListInsert(LTNode* pos, LTDataType x);//在pos位置之前插入void ListErase(LTNode* pos);//删除pos位置节点void ListDestory(LTNode* phead);//销毁链表,释放内存LTNode* ListFind(LTNode* phead, LTDataType x);//查找链表中是否有值为X的节点

然后就是各函数的实现:List.c

#include"List.h"void ListPrint(LTNode* pos)
{assert(pos);LTNode* cur = pos->next;while (cur != pos){printf("%d ", cur->data);cur = cur->next;}printf("\n");
}
LTNode* BuyListNode(LTDataType x)
{LTNode* node = (LTNode*)malloc(sizeof(LTNode));if (node == NULL) {perror("BuyListNode::malloc::");exit(-1);}node->data = x;node->next = NULL;node->prev = NULL;return node;
}LTNode* ListInit()
{LTNode* phead = BuyListNode(-1);phead->next = phead;phead->prev = phead;return phead;
}void ListInsert(LTNode* pos, LTDataType x)
{assert(pos);LTNode* prev = pos->prev;LTNode* newnode = BuyListNode(x);newnode->next = pos;newnode->prev = prev;prev->next = newnode;pos->prev = newnode;}void ListErase(LTNode* pos)
{assert(pos);LTNode* next = pos->next;LTNode* prev = pos->prev;prev->next = next;next->prev = prev;free(pos);
}LTNode* ListFind(LTNode* phead, LTDataType x)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){if (cur->data == x){return cur;}cur = cur->next;}return NULL;
}void ListDestory(LTNode* phead)
{assert(phead);LTNode* cur = phead->next;while (cur != phead){LTNode* next = cur->next;ListErase(cur);cur = next;}free(phead);phead = NULL;
}


http://www.ppmy.cn/news/193223.html

相关文章

Docker 安装 Redis 容器 (完整详细版)

Docker 安装 (完整详细版) Docker 日常命令大全(完整详细版) 1、获取Redis镜像 Docker如果想安装软件 , 必须先到 Docker 镜像仓库下载镜像。 Docker 镜像仓库 ​ 2、下载Redis镜像 命令描述docker pull redis下载最新版Redis镜像 (其实此命令就等同于 : docker pull redis…

【数据结构】希尔排序

常见的排序算法有以上八种&#xff0c;所以预估会分成几期来讲&#xff0c;感兴趣的朋友们不妨点个收藏专栏。 ღ( &#xff65;ᴗ&#xff65; )比心 OJ链接 希尔排序 在 插入排序 已经提到当数组接近有序的时候&#xff0c;时间复杂度趋于O(N)。 所以希尔排序是基于直接插…

外包干了5年,女朋友嫌弃我,跑了。。。

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近5年的测试&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了5年&#xff0c;…

【原】 ASUS笔记本没声音的解决

问题 : ASUS 型号Z91E 系统安装后没声音解决 : 先安装名叫 UAA的驱动 , 然后提示 发现新硬件 "SDA Standard Compliant SD Host Controller" , 再安装声卡驱动,就有声音了 转载于:https://www.cnblogs.com/temptation/archive/2007/10/21/931911.html

windows linux 共存,Windows与Linux共存

8种机械键盘轴体对比 本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f; 同一部计算机安装Windows和Linux双系统实现双启动&#xff0c;一般是件费力不讨好的事。当然也可以通过虚拟机安装Linux&#xff0c;听说支持虚拟化的CPU&#x…

C++课程设计项目——新生信息统计系统

名人说:一花独放不是春,百花齐放花满园。——《增广贤文》 作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 目录 一、整体框架1、整体模块2、类的实现①学生类②函数类③菜单类二、主要功能函数分析1、添加新生信息2、删除新生的信息3、按学号查询4、按学号修改新…

PyTorch实验—回归任务

PyTorch回归任务 回归任务概述&#xff1a;通过pytorch搭建神经网络&#xff0c;进行气温的预测 回归任务可以看作 y kx b y为需要进行回归预测的值 下面对实验步骤进行整理 导入相关的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt import…

计算机硬件有哪几类,计算机硬件主要有哪些?

满意答案 danny1111111 推荐于 2019.08.16 计算机硬件是计算机系统中各种设备的总称。计算机硬件应包括5个基本部分,即运算器、控制器、存储器、输入设备、输出设备,上述各基本部件的功能各异。运算器应能进行加、减、乘、除等基本运算。存储器不仅能存放数据,而且也能存放指…