数据结构之双向链表,实现双向链表的增删改查

2023-11-20

 


一、双向链表的定义

双向链表里有两个指针,一个指向前向节点,一个指向后续节点。

当链表为空的时候,phead->next = phead; phead->prev = phead;

1.双向链表节点的定义

//双向链表节点的定义
typedef int LTDataType;

typedef struct ListNode
{
    LTDataType data;
    struct ListNode * next;
    struct ListNode * prev;
}LTNode;

2.双向链表的初始化

链表的初始化主要是构建节点,malloc出节点,将指针初始化为空;然后初始化一个头节点

LTNode * BuyListNode(LTDataType x)
{
    struct ListNode * newnode = (LTNode *)malloc(sizeof(struct ListNode));
    if(newnode ==NULL)
    {
        perror("malloc fail");
        exit(-1);
    }
    newnode->data = x;
    newnode->next = NULL;
    newnode->prev = NULL;
    
    return newnode;
}

LTNode * ListInit()
{
    LTNode * phead = BuyListNode(1);
    phead->next = phead;
    phead->prev = phead;
}

二、双向链表的函数接口实现

1.双链表的尾插

phead->prev就是最后一个节点,改变指针的指向,代码如下:

void LTPushBack(LTNode * phead,LTDataType x)
{
    assert(phead);
    LTNode * newnode = BuyListNode(x);
    LTNode * tail = phead->prev;
    
    //插入 前面
    tail->next = newnode;
    newnode->prev = tail;
    //后面
    newnode->next = phead;
    phead->prev = newnode;

}

2.双向链表的尾删

删除尾节点,要保存前一个节点,tail即为phead->prev,tailPrev即为tail->prev。实现代码如下:

void LTPopBack(LTNode * phead)
{
    assert(phead);
    struct LTNode * tail = phead->prev;
    struct LTNode * tailPrev = phead->prev;
    
    tailPrev->next = phead;
    phead->prev = tailPrev;
    free(tail);
  }

3.双向链表的头插

插入前先创建节点newnode,实现代码如下:

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

4.双向链表的头删

删除掉本节点,要保存本节点的下一个节点,然后修改指针的指向

void LTPopFront(LTNode * phead)
{
    assert(phead);
    //如果链表为空,则不能删除
    assert(phead->next !=phead);
    
    LTNode * first = phead->next;
    LTNode * second = first->next;
    
    free(first);
    phead->next = second;
    second->prev = phead;
}

6.双向链表在pos前面插入

插入一个节点,首先先创建这个节点,pos指向当前位置,prev指向pos的前一个(prev),修改prev的指向,prev->next = newnode; newnode->prev = prev; newnode->next = pos; pos->prev = newnode;

void LTInsert(LTNode * pos,LTDataType x)
{
    assert(pos); //判断pos位置的有效性
    LTNode * prev = pos->prev;
    LTNode * newnode = BuyListNode(x);
    prev->next = newnode;
    newnode->prev = prev;
    newnode->next = pos;
    pos->prev = newnode;
}

7.双向链表删除pos位置的节点

删除pos位置的节点,要保存Pos的前一个和后一个,链接起来

void LTErase(LTNode * pos)
{
    assert(pos);
    LTNode * pre = pos->prev;
    LTNode * next = pos->next;
    pre->next = next;
    next->prev = pre;
}

8.双向链表的销毁

遍历销毁,最后销毁头节点

void LTDestroy(LTNode * phead)
{
    assert(phead);
    
    LTNode * cur = phead->next;
    while(cur !=phead)
    {
        LTNode * next = cur->next;
        
        free(cur); //释放掉找不到下一个,所以要保存下一个
        cur = next;
    }
    free(phead);
}

总结

本文主要介绍了双向链表以及链表的一些接口函数,技术有限,如有错误请指正。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构之双向链表,实现双向链表的增删改查 的相关文章

随机推荐

  • SM2加解密、签名验签

    导论 SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法 在我们国家商用密码体系中被用来替换RSA算法 国产SM2算法 是基于ECC的 但二者在签名验签 加密解密过程中或许有些许区别 目前鄙人还不太清楚 后期有机会的话
  • linux:http服务器搭建及实验案例

    目录 准备工作 http服务器各个配置文件大概说明 实验1 访问不同ip获得不同网页 实验2 同一ip访问不同端口获得不同网页 准备工作 1 安装http服务 2 将 etc selinux config 文件下面的 SELINUX值改为
  • 设备虚拟化基础 - PCI

    目录 1 配置空间概念和作用 2 通过配置空间发现设备 3 Linux读取PCI配置空间接口 4 内核中具体读取配置空间实例 5 Virtion设备自定义空间 6 Linux读取Capabilities List代码解析 1 配置空间概念和
  • 【解决方案】“/usr/bin/nvcc“ is not able to compile a simple test program解决方案

    问题描述 CMake Error at usr share cmake 3 16 Modules CMakeTestCUDACompiler cmake 46 message The CUDA compiler usr bin nvcc i
  • 深入理解Android之AOP

    深入理解Android之AOP 格式更加精美的PDF版请到 http vdisk weibo com s z68f8l0xTgCLK 下载 一 闲谈AOP 大家都知道OOP 即ObjectOriented Programming 面向对象编
  • OpenGL 创建OpenGL上下文(OpenGL Context WGL)

    文章目录 OpenGL Context 窗口 Pixel Format 创建上下文 Create Context MakeCurrent 删除上下文 Delete Context 如何正确创建Context 创建一个假的Context 获取
  • 2023华为OD机试真题【双指针/优雅子数组】

    题目内容 如果一个数组中出现次数最多的元素出现大于等于K次 被称为K 优雅数组 k也可以被称为优雅阈值 例如 数组1 2 3 1 2 3 1 它是一个3 优雅数组 因为元素1出现次数大于等于3次 数组1 2 3 1 2就不是一个3 优雅数组
  • 蓝桥杯 填字母游戏(博弈论)

    小明经常玩 LOL 游戏上瘾 一次他想挑战K大师 不料K大师说 我们先来玩个空格填字母的游戏 要是你不能赢我 就再别玩LOL了 K大师在纸上画了一行n个格子 要小明和他交替往其中填入字母 并且 1 轮到某人填的时候 只能在某个空格中填入L或
  • 寻找3的幂

    目录 题目 题目接口 题目思路 第一点 第二点 第三点 代码实现 普通版本 提交 递归版本 提交 结语 题目 在ledcode刷题网站上 有这样一道题 寻找3的幂 题目接口 bool isPowerOfThree int n 题目思路 第一
  • 【HTML】HTML5的拖放你用了吗

    HTML HTML5的拖放你用了吗 引言 github HTML HTML5的拖放你用了吗 内容速递 看了本文您能了解到的知识 在 HTML5 中 拖放是标准的一部分 任何元素都能够拖放 拖放的操作 多用在拖拽排序列表 游戏拼图等 下文中出
  • 华为OD机试 - 贪吃蛇(Java)

    题目描述 贪吃蛇是一个经典游戏 蛇的身体由若干方格连接而成 身体随蛇头移动 蛇头触碰到食物时 蛇的长度会增加一格 蛇头和身体的任一方格或者游戏版图边界碰撞时 游戏结束 下面让我们来完成贪吃蛇游戏的模拟 给定一个N M的数组arr 代表N M
  • roslaunch error: ERROR: cannot launch node of type

    今天在因为github上有个之前的包更新了 重新git clone后出现了一个问题 ERROR cannot launch node of type crazyflie demo controller py can t locate nod
  • 【FPGA】通俗理解从VGA显示到HDMI显示

    注 大部分参考内容来自 征途Pro FPGA Verilog开发实战指南 基于Altera EP4CE10 2021 7 10 上 贴个下载地址 野火FPGA Altera EP4CE10征途开发板 核心板 野火产品资料下载中心 文档 hd
  • MySQL报错的解决Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘

    使用数据库工具连接或还原数据库数据时 提示Can t connect to local MySQL server through socket var lib mysql mysql sock 处理方法 1 修改配置文件 vim etc m
  • 二叉树结构的建立与遍历

    实验项目 1 编写建立二叉树的二叉链表存储结构 左右链表示 的程序 并以适当的形式显示和保存二叉树 2 完成二叉树的7种遍历操作 3 给定一个二叉树 编写算法完成下列应用 1 判断其是否为完全二叉树 2 求二叉树中任意两个结点的公共祖先 输
  • wps日期加减算天数_日期相减之后的天数怎么用公式计算 - 卡饭网

    如何在Excel中得到两个日期相减的天数 如何在Excel中得到两个日期相减的天数 有的小伙伴在使用Excel软件时 想要知道两个日期相减后的天数 但是却不知道使用什么公式 也不知道公式中的数据的含义 那么小编就来为大家介绍一下吧 具体如下
  • Python安装教程(版本3.8.10)windows10

    Python目前已支持市面上的各大主流操作系统 在Linux Unix Mac系统已经自带Python环境 本章将介绍在Windows系统上安装Python 一般下载 executable installer x86 表示是 32 位的机器
  • 基于Python Django 搜索的目标站点内容监测系统设计

    1 简介 基于搜索的目标站点内容监测系统 包括登陆 首页 数据采集 爬虫分析 数据管理 修改密码和用户管理等功能 2 技术栈 说明 技术栈 备注 后台 Python Django 前端 HTML 数据库 MYSql 架构 B S 结构 3
  • MySQL数据库保姆级安装教程

    俗话说从入门到放弃 从入门到入土 开始学习MySQL之前我们一定是要做环境准备的 接下来我们来讲解一下MySQL的安装 一 MySQL下载 MySQL 1 大家可以尝试在官网首页寻找下载入口 也可以使用我提供的MySQL的安装包进行下载安装
  • 数据结构之双向链表,实现双向链表的增删改查

    目录 一 双向链表的定义 1 双向链表节点的定义 2 双向链表的初始化 二 双向链表的函数接口实现 1 双链表的尾插 2 双向链表的尾删 3 双向链表的头插 4 双向链表的头删 6 双向链表在pos前面插入 7 双向链表删除pos位置的节点