双链向表专题

1.链表的分类

链表的种类非常多组合起来就有 2 × 2 = 8种

 链表说明:

虽然有这么多的链表的结构,但是我们实际中最常⽤还是两种结构: 单链表 双向带头循环链表
1. 无头单向⾮循环链表:结构简单,⼀般不会单独⽤来存数据。实际中更多是作为其他数据结
构的⼦结构,如哈希桶、图的邻接表等等。另外这种结构在笔试⾯试中出现很多。
2. 带头双向循环链表:结构最复杂,⼀般⽤在单独存储数据。实际中使⽤的链表数据结构,都
是带头双向循环链表。另外这个结构虽然结构复杂,但是使⽤代码实现以后会发现结构会带
来很多优势,实现反⽽简单了,后⾯我们代码实现了就知道了。

2.双向链表的实现

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;
}LTNode;//初始化链表
LTNode* LTInit();//打印链表
void LTPrintf(LTNode* phead);//申请节点
LTNode* LTBuyNode(LTDataType x);//尾插
void LTPushBack(LTNode* phead, LTDataType x);//头插
void LTPushFront(LTNode* phead, LTDataType x);//尾删
void LTPophBack(LTNode* phead, LTDataType x);//头删
void LTPopFront(LTNode* phead, LTDataType x);//用数据找到该节点
LTNode* LTFind(LTNode* phead, LTDataType x);//在pos位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x);//删除pos位置的数据
void LTErase(LTNode* pos);//销毁链表
void LTDestroy(LTNode* phead);

List .c

#define _CRT_SECURE_NO_WARNINGS 1
#include"List.h"//初始化链表
LTNode* LTInit() {LTNode* sbw = LTBuyNode(-1);return sbw;
}//打印链表
void LTPrintf(LTNode* phead) {assert(phead);LTNode* pcur = phead->next;while (pcur != phead){printf("%d->", pcur->Data);pcur = pcur->next;}printf("\n");
}//申请节点
LTNode* LTBuyNode(LTDataType x) {LTNode* node = (LTNode*)malloc(sizeof(LTNode));if (node == NULL){perror("malloc");exit(1);}node->next = node->prev = node;node->Data = x;return node;
}//尾插
//不改变头节点(哨兵卫),所以传一级指针,但是可以通过这个指针去改变这个地址下元素的值
void LTPushBack(LTNode* phead, LTDataType x) {assert(phead);LTNode* newnode = LTBuyNode(x);newnode->prev = phead->prev;  //新尾节点prev指向原尾节点newnode->next = phead;        //新尾节点next指向哨兵卫phead->prev->next = newnode;//原尾节点next指向新尾节点phead->prev = newnode;      //哨兵卫prev指向新尾节点
}//头插
void LTPushFront(LTNode* phead, LTDataType x) {assert(phead);LTNode* newnode = LTBuyNode(x);newnode->next = phead->next;newnode->prev = phead;phead->next->prev = newnode;newnode->next = newnode;
}//尾删
void LTPophBack(LTNode* phead, LTDataType x) {assert(phead);LTNode* del = phead->prev ;//原尾节点,相对新尾节点的下一个节点del->prev->next = phead;//新尾节点(原尾节点的上一个节点)的next指向哨兵卫phead->prev = del->prev;//哨兵卫的prev指向新尾节点free(del);del = NULL;
}//头删
void LTPopFront(LTNode* phead, LTDataType x) {assert(phead);LTNode* del = phead->next;//相对哨兵卫的下一个节点del->next->prev = phead;phead->next = del->next;free(del);del = NULL;
}//用节点的Date数据,找到该节点
LTNode* LTFind(LTNode* phead, LTDataType x) {LTNode* Find = phead->next;while (Find != phead){if (Find->Data == x){return Find;}Find = Find->next;}//没找到return NULL;
}//在指定位置之后插入数据
void LTInsert(LTNode* pos, LTDataType x) {assert(pos);LTNode* newnode = LTBuyNode(x);newnode->next = pos->next;newnode->prev = pos;//一般来说都是先改后面的节点,避免数据的丢失pos->next->prev = newnode;pos->next = newnode;
}//删除pos位置的数据
void LTErase(LTNode* pos) {assert(pos);pos->next->prev = pos->prev;//处理pos下一个节点的prev指向pos->prev->next = pos->next;//处理pos上一个节点的next指向free(pos);pos = NULL;
}//销毁链表
void LTDestroy(LTNode* phead) {LTNode* pcur = phead->next;while (pcur != phead){LTNode* next = pcur->next;free(pcur);pcur = next;}free(pcur);pcur = NULL;}

3.顺序表和双向链表的优缺点分析

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

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

相关文章

matlab学习003-绘制由差分方程表示的离散系统图像

目录 1&#xff0c;题目 2&#xff0c;使用函数求解差分方程 1&#xff09;基础知识 ①filter函数和impz函数 ②zeros函数 ☀ 2&#xff09;绘制图像 ​☀ 3&#xff09;对应代码 如果连简单的信号都不会的&#xff0c;建议先看如下文章&#x1f447;&#xff0c;之…

科东软件Intewell-Win_V2.1.0_release版本正式发布,鸿道Intewell引领新型操作系统

Intewell-Win_V2.1.0_release版本正式发布_工业嵌入式实时操作系统 Intewell-Win_V2.1.0_release版本 版本号&#xff1a;V2.1.0 版本发布类型&#xff1a;release正式版本 版本特点 增加系统配置服务和web配置工具 特殊说明 版本或修改说明&#xff1a;无 增加功能&…

列车tcn网络mvb从站接收代码流程解析

TCN-列车通信网络概述 机车车辆通信网络&#xff08;TCN-列车通信网络&#xff09;的基本组件是在整个列车单元中提供数据通信的有线列车总线&#xff08;WTB&#xff09;和用于在车辆或固定连接车辆组&#xff08;组成&#xff09;内进行数据交换&#xff08;通信&#xff09…

Rust入门-所有权

一、为什么、是什么、怎么用 1、为什么Rust要提出一个所有权和借用的概念 所有的程序都必须和计算机内存打交道&#xff0c;如何从内存中申请空间来存放程序的运行内容&#xff0c;如何在不需要的时候释放这些空间&#xff0c;成为所有编程语言设计的难点之一。 主要分为三种…

时钟HRC、LRC的校正

时钟校准 HRC校准原理LRC校准原理校准系数自加载flash测试步骤相关代码 HRC校准原理 寻找最合适的HRC温度特性调节HRC_TC、HRC输出频率调节控制位HRC_ADJ&#xff0c;使得HRC的实际频率和期望频率差别最小。 LRC校准原理 寻找最合适的LRC输出频率调节控制位LRC_ADJ使误差最…

谷歌广告B2C实战特训营,500+谷歌账户经验,实战演示从0-1搭建广告账户

结合数据优化搜索、购物(PMax)、再营销、展示、视频广告类型&#xff0c;提升ROI稳定增长 课程背景&#xff1a; 不同的电商产品(如大件家具、假发、服饰等)适合的广告类型、组合策略、预算配置大不相同。 为了让大家最快掌握不同产品的投放策略找到最适合自己的打法&#x…

vuex和pinia转态管理工具介绍

一、介绍 相同点&#xff1a; 都是Vue.js的状态管理工具 不同点&#xff1a; 区别PiniaVuex支持Vue2和Vue3都支持Vue3写法需要额外配置Mutation只有 state, getter 和 action&#xff0c;无Mutationaction异步、Mutation 同步actionaction支持同步和异步action异步、Mutatio…

nvm管理多个node版本,快速来回切换node版本

前言 文章基于 windows环境 使用nvm安装多版本nodejs。 最近公司有的项目比较老需要降低node版本才能运行&#xff0c;由于来回进行卸载不同版本的node比较麻烦&#xff1b;所以需要使用node工程多版本管理&#xff0c;后面自己就简单捯饬了一下nvm来管理node&#xff0c;顺便…

淘宝京东比价接口推荐(商品api接口)

主流电商商品API接口 数据时代&#xff0c;做好数据分析的重要性不言而喻。电商行业也同样如此&#xff0c;做好商品数据的整合分析&#xff0c;对于电商企业来说&#xff0c;有以下几个好处&#xff1a; 更好地了解产品表现。通过商品数据分析&#xff0c;品牌方可以了解到商…

前端css中的transform(转换)的使用

前端css中的transform的使用 一、前言二、流程图三、举例&#xff08;一&#xff09;、平移1.平移&#xff0c;源码12.源码1运行效果(1).视频效果(2).截图效果 3.平移3d效果&#xff0c;源码24.源码2运行效果&#xff08;1&#xff09;、视频效果&#xff08;2&#xff09;、截…

甘特图:如何制定一个有效的产品运营规划?

做好一个产品的运营规划是一个复杂且系统的过程&#xff0c;涉及多个方面和阶段。以下是一些关键步骤和考虑因素&#xff0c;帮助你制定一个有效的产品运营规划&#xff1a; 1、明确产品定位和目标用户&#xff1a; 确定产品的核心功能、特点和优势&#xff0c;明确产品在市…

Android Studio实现内容丰富的安卓校园超市

获取源码请点击文章末尾QQ名片联系&#xff0c;源码不免费&#xff0c;尊重创作&#xff0c;尊重劳动 项目代号168 1.开发环境 后端用springboot框架&#xff0c;安卓的用android studio开发 android stuido3.6 jdk1.8 idea mysql tomcat 2.功能介绍 安卓端&#xff1a; 1.注册…