双向链表(C语言实现)

C语言实现双向链表 * 定义双向链表节点结构体 */int data;/* 数据域 *//* 前驱指针 *//* 后继指针 *//* 定义双向链表 *//* 头指针 *//* 尾指针(可选,非必须) */ 阅读详情
双向链表是一种链式数据结构,它允许我们在链表中向前和向后遍历。每个节点都包含指向前一个节点和后一个节点的指针。相比单向链表,双向链表可以更快地进行向前和向后的遍历,但它的实现也更加复杂。

code:

#include <stdio.h>
#include <stdlib.h>

struct Node {
    int data;
    struct Node* next;
    struct Node* prev;
};

void insertAtBeginning(struct Node** head_ref, int new_data) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = new_data;
    new_node->next = (*head_ref);
    new_node->prev = NULL;

    if ((*head_ref) != NULL)
        (*head_ref)->prev = new_node;

    (*head_ref) = new_node;
}

void insertAfter(struct Node* prev_node, int new_data) {
    if (prev_node == NULL) {
        printf("The given previous node cannot be NULL");
        return;
    }

    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    new_node->data = new_data;
    new_node->next = prev_node->next;
    prev_node->next = new_node;
    new_node->prev = prev_node;

    if (new_node->next != NULL)
        new_node->next->prev = new_node;
}

void insertAtEnd(struct Node** head_ref, int new_data) {
    struct Node* new_node = (struct Node*)malloc(sizeof(struct Node));
    struct Node* last = *head_ref;

    new_node->data = new_data;
    new_node->next = NULL;

    if (*head_ref == NULL) {
        new_node->prev = NULL;
        *head_ref = new_node;
        return;
    }

    while (last->next != NULL)
        last = last->next;

    last->next = new_node;
    new_node->prev = last;
}

void deleteNode(struct Node** head_ref, struct Node* del) {
    if (*head_ref == NULL || del == NULL)
        return;

    if (*head_ref == del)
        *head_ref = del->next;

    if (del->next != NULL)
        del->next->prev = del->prev;

    if (del->prev != NULL)
        del->prev->next = del->next;

    free(del);
}

void printList(struct Node* node) {
    struct Node* last;
    printf("\nTraversal in forward direction \n");
    while (node != NULL) {
        printf(" %d ", node->data);
        last = node;
        node = node->next;
    }

    printf("\nTraversal in reverse direction \n");
    while (last != NULL) {
        printf(" %d ", last->data);
        last = last->prev;
    }
}

int main() {
    struct Node* head = NULL;

    insertAtEnd(&head, 6);
    insertAtBeginning(&head, 7);
    insertAtBeginning(&head, 1);
    insertAtEnd(&head, 4);
    insertAfter(head->next, 8);

    printf("Created DLL is: ");
    printList(head);

    deleteNode(&head, head);
    deleteNode(&head, head->next);
    deleteNode(&head, head->next);

    printf("\nDLL after deletion is: ");
    printList(head);

    return 0;
}
双向链表常见的应用案例有:
  1. 实现LRU缓存淘汰算法:维护一个双向链表,每次访问数据时,将数据节点移到链表头部,当缓存满时,淘汰链表尾部节点。

  2. 实现文本编辑器:文本编辑器需要支持插入、删除、移动光标等操作,使用双向链表可以方便地实现。

  3. 实现浏览器前进后退功能:浏览器中的历史记录可以使用双向链表维护,每次访问一个新的页面时,将其加入链表尾部,当需要前进或后退时,将指针移动到前一个或后一个节点。

  4. 实现音乐播放器:音乐播放器需要支持播放列表的增删改查操作,使用双向链表可以方便地实现。

  5. 实现哈希表:哈希表中每个桶内的元素可以使用双向链表来实现,方便插入、删除、查找等操作。

  6. 数据库中的双向链表:数据库中的双向链表是实现事务和并发控制的一种常见数据结构,可以在读写过程中有效地管理数据。

  7. 图形用户界面 (GUI):GUI 中的窗口、菜单和工具栏等通常使用双向链表来管理它们的布局和交互。

  8. 浏览器历史记录:浏览器历史记录通常使用双向链表来记录用户的浏览历史,使用户可以通过点击“前进”和“后退”按钮来返回之前访问过的网页。

  9. 编辑器中的文本编辑器:文本编辑器使用双向链表来存储文本文档中的字符,并且可以将其作为光标的位置。

  10. 内存管理:内存管理系统中,双向链表用于跟踪空闲内存块和已分配的内存块,并且在内存分配和释放时改变指针。
    … …

C语言实现双向链表删除节点、插入节点、双向输出等操作 #include #include typedef struct DoubleLinkedList { int data; struct DoubleLinkedList *pre; struct DoubleLinkedList *next; }DlinkedList_Node; //建立链表 DlinkedList_Node* createDLink() { D 阅读详情

相关推荐

C语言实现双向链表的算法(含完整源码)

双向链表是一种比较常见的数据结构,它可以在单向链表的基础上增加了一个指向前驱节点的指针,这样既可以从头部开始遍历,也可以从尾部开始遍历,并且插入或删除操作也方便了很多,下面将介绍C语言实现双向链表的详细算法和源代码。该函数用于在指定位置插入新节点,需要传入链表头指针、插入位置和新节点数据。该函数用于删除指定位置的节点,需要传入链表头指针和删除位置。该函数用于遍历链表并打印节点数据,需要传入链表头指针。该函数用于初始化链表,需要传入链表头指针。是指向前驱节点的指针,是指向后继节点的指针。表示节点存储的数据,

CyberNova的博客 204

C语言---双向链表(详解)---数据结构

双向链表所需要头文件 首先重定义类型名 意义我前几篇讲过几次了,这里就不在赘述了,(顺序表,单链表的开头都有说明) 然后我们需要一个结构体 结构体包含 : 存储数据的 a 指向一个节点的指针 next 指向上一个节点的指针 prve 双向链表实现的函数功能有 :1.申请动态内存空间 2.初始化 3.双向链表的头,尾的插入与删除,在合法的任意位置进行插入和删除 4.释放链表,5.打印链表 1.申请动态内存空间 因为进行插入和初始化需要用到此函数 所以我们要先实现此功能 1.先申.

烁岩的博客 7821

无人机航拍实战:如何用Python代码精准计算目标地理坐标(附完整代码)

本文详细介绍了如何利用Python代码实现无人机航拍图像中目标点的精准地理位置计算。通过解析从像素坐标系到WGS84大地坐标系的完整转换链条,结合相机内参、无人机姿态与地球曲率处理,提供了可直接运行的实战代码,并重点分析了地理位置计算中的常见误差来源与应对策略,助力开发者解决实际项目中的定位漂移问题。

hh234的博客 357

【数据结构】—C语言实现双向链表(超详细!)

本文是作者对于双向链表以及循环链表的学习记录,也是对于链表学习画上的一个句号。

B1ue还在专注 5047

WINCC8.1工业组态软件安装与授权配置指南

SCADA系统作为工业自动化控制的核心平台,通过实时数据采集与监控实现生产流程可视化。WINCC作为西门子旗舰级组态软件,其8.1版本凭借稳定的运行时环境在汽车制造、流程工业等领域广泛应用。本文从工业控制系统软件安装规范切入,重点解析WINCC8.1与Automation License Manager的协同工作原理,详细说明包括系统环境检查、安装包校验、授权文件配置等关键技术环节。针对工程实施中常见的内存配置不足、授权管理器报错等典型问题,提供经过现场验证的解决方案,特别适用于需要进行产线监控系统升级维护

cqwf95925的博客 1651

ScanNet数据集下载全攻略:从申请到解析的保姆级教程(含常见问题解决)

本文提供了ScanNet数据集从申请授权到下载、解析的完整实战指南。针对这个大规模室内RGB-D数据集,详细介绍了官方申请流程、优化下载策略、数据验证方法,并重点解决了深度图解析等常见问题,帮助三维视觉研究者高效获取和使用这一宝贵资源。

5f4d3s2a1q的博客 617

双向链表(数据结构)(C语言)

双向链表的结构体定义、双向链表的初始化、关于无头单向非循环链表无需初始化函数,顺序表、带头双向循环链表需要的思考、双向链表在pos位置之前插入x、双向链表的打印 双链表删除pos位置的结点、双向链表的尾插、关于单链表的尾插需要用到二级指针,双向链表不需要用到二级指针的思考、双向链表的判空、双向链表的尾删、双向链表的头插、双向链表的头删、双向链表查找值为x的结点、双向链表的销毁、双向链表的修改、双向链表删除值为x的结点、双向链表计算结点总数(不计phead)、双向链表获取第

outdated_socks的博客 5406

AD20/Altium designer——元器件批量命名与编号的高效技巧

本文详细介绍了在AD20/Altium Designer中实现元器件批量命名与编号的高效技巧。通过解析核心的“原理图标注”功能,从基础全局操作到进阶的按模块分区、利用标识符及合并BOM等智能方法,帮助硬件工程师彻底告别手动编号,大幅提升设计效率与文档规范性,并融入了一套完整的实战工作流。

whisky的博客 568

c语言简单实现双向链表

c语言最简单实现双向链表

欢迎来到梨+萍的博客,不准备看点啥学习嘛。。。 2895

基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台

电动汽车的动力总成(Powertrain)是车辆的核心系统,包括动力电池、电机控制器、逆变器和驱动电机等关键部件。动力总成的控制策略直接影响车辆的动力性能、能耗效率和驾驶体验。为了验证和优化这些控制策略,基于MATLAB/Simulink的仿真平台成为一种高效且经济的解决方案。本项目旨在构建一个完整的基于Simulink的电动汽车动力总成控制策略验证与标定仿真平台,涵盖控制策略建模、性能评估以及参数标定等功能模块,并通过仿真验证系统的有效性。

xiaoheshang_123的博客 177

网络层隧道技术之ICMP隧道(pingTunnel/IcmpTunnel)

目录 ICMP隧道 使用ICMP搭建隧道(PingTunnel) 使用ICMP搭建隧道(Icmptunnel) ICMP隧道 ICMP隧道简单实用,是一个比较特殊的协议。在一般的通信协议里,如果两台设备要进行通信,肯定需要开放端口,而在ICMP协议下就不需要。最常见的ping命令就是利用的ICMP协议,攻击者可以利用命令行得到比回复更多的ICMP请求。在通常情况下,每个ping命令都有相...

谢公子的博客 6696

用C语言实现双向链表

用C语言实现了一个带头双向循环链表,简单介绍了每个函数的实现和顺序表与双向链表的优缺点。

0xFFFFFFFF 1452

XGBoost原生接口和Sklearn接口参数详解

XGBoost原生接口和Sklearn接口参数详解

算法工程师 2654

C语言双向链表的实现

双向链表简介 我们知道,单链表(singly linked list)只有一个指向直接后继的指针来表示结点间的逻辑关系,可以方便地查找下一个结点,但是找前驱结点就非常困难。这时,我们就需要用上双向链表(doubly linked list)来解决这个问题。 结构体构建 第一个动作和单链表类似,我们使用结构体来定义出这种数据类型。代码: typedef struct DLinkNode{ int data; struct DLinkNode *prev; struct DLinkNode *next;

m0_63666616的博客 5055

深入URP之Shader篇1: URP Shader概述

我们知道,URP和HDRP都是基于SRP的,尽管现在可以使用Shader Graph编写Shader,但是手写Shader仍然是有一定的优势,特别是在性能方面,手写Shader可以更极致的优化,因此我们在项目中前期都是直接使用Shader Graph编写Shader,项目后期会改成手写Shader来提高性能。而在SRP中手写Shader,我们仍然使用的是Shader Lab,这个结构并没有太大的变化,但是SRP Shader中使用Shader Lab语言还是有几点不同。

聚焦游戏和图形引擎开发技术 4637

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

双向链表--C语言实现数据结构

本文详细介绍带头双向循环链表,内容较为丰富

2201_76062618的博客 5455

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C语言双向链表实现

C语言双向链表实现 链表是计算机编程中常用的一种数据结构,在大部分面向对象的编程语言中都会有封装好的类供用户直接使用,只有在数据结构课程中,老师才会要求学生用代码实现一个链表,而如果用C语言实现链表,除了要了解链表的特性之外,对于指针的操作也是一个重头戏。 开发环境:VS2013 开发系统:window7 头文件(TwoWayList.h)代码如下: #ifndef TWOWAY_...

lichangshun3的博客 1888

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

双向链表的c语言实现

双向链表的c语言实现 引入 上一篇最后总结了单向链表的缺点,所以引入了双向链表。我认为双向链表相对于单向链表最大的优势就是省脑子,不需要再另有一个指针时时在前面。 单向链表 代码实现 问题描述 Write a program to print students’ information (ID number, name, gender, and scores) by the order of th...

qq_45910536的博客 351

数据结构之C语言实现双向链表

C语言实现双向链表 双向链表主要实现以下功能: 双向链表创建 节点头插 节点尾插 指定位置插入节点 节点删除 链表排序 链表求长 /****************************************************************************************************** * function:自定义一个...

煮酒论英雄 8082

C语言实现双向链表(附带源码)

C语言实现双向链表(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1924

双向链表C语言实现

双向链表与单链表的区别在于多了一个指向上一个节点的指针prevint data;}Node;

m0_46893236的博客 505
上一篇: 记录:clion上开发stm32 环境配置(保姆级详细教程)----->2023_7_1
下一篇: 智能家居必不可少的通信协议ZigBee(概念:什么是zigbee)
DennisReYoonjiho
博客等级 码龄7年 216粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值