【数据结构与算法篇】双链表实现

【数据结构与算法篇】双链表实现(近300行实现代码)

🥕个人主页:开敲🍉

🔥所属专栏:数据结构与算法🍅

🌼文章目录🌼

1. List.h 头文件的声明

2. List.c 源文件的定义

3. Test.c 源文件的测试

1. List.h 头文件的声明

#pragma once


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


typedef int LDataType;


typedef struct ListNode
{
    LDataType val;
    struct ListNode* next;
    struct ListNode* prev;
}LN;


//初始化
LN* LNInit();

//打印
void LNPrint(LN* phead);


//尾插
void LNPushBack(LN* phead, LDataType x);


//头插
void LNPushHead(LN* phead, LDataType x);


//尾删
void LNPopBack(LN* phead);


//头删
void LNPopHead(LN* phead);


//指定插入
void LNPushDesi(LN* head, int y, LDataType x);


//指定删除
void LNPopDesi(LN* phead, int y);


//查找
void LNFind(LN* phead, int y);


//更改
void LNChange(LN* phead, int y, LDataType x);

2. List.c 源文件的定义

#define _CRT_SECURE_NO_WARNINGS 1

#include "List.h"


//初始化
LN* LNInit()
{
    LN* phead = (LN*)malloc(sizeof(LN));
    if (phead == NULL)
    {
        exit(-1);
    }
    phead->val = -1;
    phead->next = phead;
    phead->prev = phead;
    return phead;
}

//创建节点
LN* BuyNode(LDataType x)
{
    LN* pcur = (LN*)malloc(sizeof(LN));
    if (pcur == NULL)
    {
        exit(-1);
    }
    pcur->val = x;
    pcur->next = NULL;
    pcur->prev = NULL;
    return pcur;
}


//打印
void LNPrint(LN* phead)
{
    LN* pcur = phead->next;
    while (pcur != phead)
    {
        printf("%d->", pcur->val);
        pcur = pcur->next;
    }
    printf("\n");
}


//尾插
void LNPushBack(LN* phead, LDataType x)
{
    assert(phead);
    LN* pcur = BuyNode(x);
    pcur->next = phead;
    phead->prev->next = pcur;
    pcur->prev = phead->prev;
    phead->prev = pcur;
}

//头插
void LNPushHead(LN* phead, LDataType x)
{
    assert(phead);
    LN* pcur = BuyNode(x);
    phead->next->prev = pcur;
    pcur->next = phead->next;
    phead->next = pcur;
    pcur->prev = phead;
}


//尾删
void LNPopBack(LN* phead)
{
    assert(phead && phead->next!=phead);
    LN* del = phead->prev;
    del->prev->next = phead;
    phead->prev = del->prev;
    free(del);
}


//头删
void LNPopHead(LN* phead)
{
    assert(phead && phead->next!=phead);
    LN* del = phead->next;
    del->next->prev = phead;
    phead->next = del->next;
    free(del);
}


//查找
LN* NodeFind(LN* phead, int y)
{
    LN* phead1 = phead->next;
    int count = 1;
    if (y == 0)
    {
        return NULL;
    }
    while (phead1 != phead)
    {
        if (count == y)
        {
            return phead1;
        }
        count++;
        phead1 = phead1->next;
    }
    return NULL;
}


//指定插入
void LNPushDesi(LN* phead, int y, LDataType x)
{
    assert(phead);
    LN* pget = NodeFind(phead, y);
    if (pget == NULL)
    {
        printf("无法在此处插入数据!\n");
        exit(-1);
    }
    LN* pcur = BuyNode(x);
    pcur->next = pget;
    pcur->prev = pget->prev;
    pget->prev->next = pcur;
    pget->prev = pcur;
}


//指定删除
void LNPopDesi(LN* phead, int y)
{
    assert(phead && phead->next != phead);
    LN* pget = NodeFind(phead,y);
    if (pget == NULL)
    {
        printf("无法在此处删除数据!\n");
        exit(-1);
    }
    pget->prev->next = pget->next;
    pget->next->prev = pget->prev;
    free(pget);
    pget = NULL;
}


//查找
void LNFind(LN* phead, int y)
{
    assert(phead && phead->next != phead);
    LN* pfind = NodeFind(phead, y);
    if (pfind == NULL)
    {
        printf("查找失败!\n");
    }
    printf("查找成功,该位置数据为:%d\n", pfind->val);
}


//更改
void LNChange(LN* phead, int y, LDataType x)
{
    assert(phead && phead->next != phead);
    LN* pget = NodeFind(phead, y);
    if (pget == NULL)
    {
        printf("更改失败!\n");
    }
    pget->val = x;
}

3. Test.c 源文件的测试

#define _CRT_SECURE_NO_WARNINGS 1


#include "List.h"


void ListTest()
{

    //初始化
    LN* plist = LNInit();

    //尾插
    LNPushBack(plist, 1);
    LNPushBack(plist, 2);
    LNPushBack(plist, 3);
    LNPushBack(plist, 4);
    LNPrint(plist);//打印


    //头插
    LNPushHead(plist, 0);
    LNPrint(plist);


    //尾删
    LNPopBack(plist);
    LNPrint(plist);


    //头删
    LNPopHead(plist);
    LNPrint(plist);


    //指定插入
    LNPushDesi(plist, 3, 10);
    LNPrint(plist);


    //指定删除
    LNPopDesi(plist, 4);
    LNPrint(plist);


    //查找
    LNFind(plist, 3);


    //更改
    LNChange(plist, 3, 1000);
    LNPrint(plist);
}


int main()
{
    ListTest();
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python通过socket搭建一个web服务器

目录 01、源码 02、运行结果 03、小结 Socket是一种计算机网络通信的一种机制&#xff0c;它允许不同计算机或进程之间通过网络进行数据传输和通信。Socket可以被看作是不同计算机之间的数据传输通道&#xff0c;通过这个通道&#xff0c;计算机之间可以进行双向的数据传输。…

在线药房数据惨遭Ransomhub窃取,亚信安全发布《勒索家族和勒索事件监控报告》

本周态势快速感知 本周全球共监测到勒索事件119起&#xff0c;与上周相比勒索事件有所增长。 本周Blacksuit是影响最严重的勒索家族&#xff0c;Ransomhub和Blackbasta恶意家族紧随其后&#xff0c;从整体上看Lockbit3.0依旧是影响最严重的勒索家族&#xff0c;需要注意防范。…

二百三十二、Kettle——修改MySQL中历史数据为当前系统日期并增量同步到ClickHouse中

一、目的 由于一些雷达死了但是又需要有数据进行展示&#xff0c;于是就把这些雷达的历史数据&#xff0c;修改日期为当前日期后&#xff0c;增量同步到ClickHouse中&#xff0c; 二、难点 1、获取当前日期&#xff0c;并且修改历史数据的create_time字段的日期部分 2、如果…

C语言之九九乘法表||素数||最小公倍数

一、九九乘法表 &#xff08;1&#xff09;思路 1、九九乘法表中存在三个变量&#xff0c;以 x1 ; x2 ; y 为例&#xff08;这里也可以使用两个变量&#xff0c;用x1和x2来表示y&#xff0c;方法一样&#xff09; 2、想好了变量之后&#xff0c;我们要想怎样将他实现呢&#x…

Excel/WPS超级处理器,提取汉字/字母/数字

在职场工作中&#xff0c;经常会遇到单元格中有汉字&#xff0c;数字&#xff0c;字母三者的自由组合&#xff0c;但往往只需要其中的一者&#xff0c;如何快速提取呢&#xff0c;超级处理器&#xff0c;提供了4个功能可选。 超级处理器下载与安装 1&#xff09;分离字符 将…

前端用 HTML5 + CSS3 + JavaScript,后端连接什么数据库更简单?

当前端使用 HTML5、CSS3 和 JavaScript 进行开发时&#xff0c;后端连接何种数据库是一个非常重要的问题&#xff0c;因为数据库的选择直接影响着后端代码的编写、数据存储与查询的效率以及系统的可维护性。 1. 关系型数据库&#xff08;SQL 数据库&#xff09;&#xff1a; …

水经微图IOS版5.2.0发布

随时随地&#xff0c;微图一下&#xff01; 水经微图&#xff08;简称“微图”&#xff09;IOS新版已上线。 在该版本中主要新增图层树节点排序功能、常规&#xff08;矩形、圆、椭圆、扇形&#xff09;绘制功能、地形夸张等主要功能。 当前版本 当前版本号为&#xff1a;5…

分类算法——sklearn转换器和估计器(一)

转换器&#xff08;特征工程的父类&#xff09; 实例化&#xff08;实例化的是一个转换器类&#xff08;Transformer&#xff09;&#xff09;调用fit_transform&#xff08;对于文档建立分类词频矩阵&#xff0c;不能同时调用&#xff09; 把特征工程的接口称之为转换器&…

mac配置Jmeter环境

mac配置Jmeter环境 一、安装jmeter二、Jmeter目录结构三、汉化Jmeter四、jmeter安装第三方插件 一、安装jmeter 第一步先自行配置好电脑的jdk环境 1、官网下载jar包 https://jmeter.apache.org/download_jmeter.cgi 2、解压到软件安装目录 3、启动Jmeter 启动方式1️⃣&#x…

OpenHarmony开发——CMake方式组织编译的库移植

概述 本文为OpenHarmony开发者提供一些组织编译形式比较常见&#xff08;CMakeLists、Makefile&#xff09;的三方库的移植指南&#xff0c;该指南当前仅适用于Hi3516DV300和Hi3518EV300两个平台&#xff0c;文中着重介绍各编译组织方式下工具链的设置方法以及如何将该库的编译…

Eclipse新建类的时候如何自动添加注释

Eclipse新建类的时候如何自动添加注释 主要有两种方法&#xff1a;①创建类文件时自动添加注释&#xff1b;②文件注释 方法一&#xff1a;类注释 windows -> preferencesJava -> Code Style -> Code TemplatesCode -> new Java filesedit 填入下面的数据 ${fi…

简析OpenHarmony软总线能力

分布式软总线是 OpenHarmony 的重要能力&#xff0c;设计目标是实现多设备间的通信方式。分布式软总线是分布式硬件和分布式软总线的重要基础&#xff0c;分布式软总线提供一种不区分链路的设备间发现、组网和传输的能力&#xff1a; 发现&#xff1a;应用 WiFi&#xff0c;蓝…

QA测试开发工程师面试题满分问答11: web前端页面视频组件无法播放如何定位bug

当 web 前端页面的视频组件无法播放时&#xff0c;可以从以下维度进行分析和定位可能的 bug&#xff0c;分析维度包括但不限于&#xff1a;前端功能点、缓存、异常、后端功能点、资源占用、并发、网络等&#xff1a; 前端功能点&#xff1a; HTML5 视频支持&#xff1a;检查视频…

更换淘宝镜像地址,旧的已经失效(https://registry.npm.taobao.org )

旧的镜像地址&#xff1a;npm install --registryhttps://registry.npm.taobao.org 新的镜像地址&#xff1a;npm install --registryhttps://registry.npmmirror.com

【Python细类】全局日志调试模式

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

DMA的认识

DMA介绍 Q:什么是DMA&#xff1f; DMA( Direct Memory Access&#xff0c;直接存储器访问 ) 提供在 外设与内存 、 存储器和存储器 、 外设 与外设 之间的 高速数据传输 使用。它允许不同速度的硬件装置来沟通&#xff0c;而不需要依赖于 CPU &#xff0c;在这个时间中&am…

超低功耗Sub-1G收发芯片DP32RF002 M0内核(G)FSK/OOK 无线收发机的32位SoC芯片

产品概述 DP32RF002是深圳市动能世纪科技有限公司研制的基于ARMCortex-MO内核的超低功耗 高性能的、单片集成(G)FSK/OOK 无线收发机的32位SoC芯片。工作于200 ~960MHz范围内&#xff0c;支持灵活可设的数据包格式&#xff0c;支持自动应答和自动重发功能&#xff0c;支持跳频…

BoostCompass(建立正排索引和倒排索引模块)

阅读导航 一、模块概述二、编写正排索引和倒排索引模块✅安装 jsoncpp✅Jieba分词库的安装1. 代码基本框架2. 正排索引的建立3. 倒排索引的建立 三、整体代码⭕index.hpp 一、模块概述 这个模块我们定义了一个名为Index的C类&#xff0c;用于构建和维护一个文档索引系统。该系…

微信小程序 uniapp+vue城市公交线路查询系统dtjl3

小程序Android端运行软件 微信开发者工具/hbuiderx uni-app框架&#xff1a;使用Vue.js开发跨平台应用的前端框架&#xff0c;编写一套代码&#xff0c;可编译到Android、小程序等平台。 前端&#xff1a;HTML5,CSS3 VUE 后端&#xff1a;java(springbootssm)/python(flaskdja…

Uniapp+基于百度智能云完成AI视觉功能(附前端思路)

本博客使用uniapp百度智能云图像大模型中的AI视觉API&#xff08;本文以物体检测为例&#xff09;完成了一个简单的图像识别页面&#xff0c;调用百度智能云API可以实现快速训练模型并且部署的效果。 uniapp百度智能云AI视觉页面实现 先上效果图实现过程百度智能云Easy DL训练图…