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

【数据结构与算法篇】双链表实现(近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;
}

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

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

相关文章

etcd相关知识整理归纳 —— 筑梦之路

什么是etcd? Etcd 是 CoreOS 团队于2013年6月发起的开源项目&#xff0c;它的目标是构建一个高可用的分布式键值(key-value)数据库。etcd内部采用raft协议作为一致性算法&#xff0c;Etcd基于 Go 语言实现。 名字由来&#xff0c;它源于两个方面&#xff0c;unix的“/etc”文件…

软件概要设计说明书实际项目编制案例(直接套用)

1引言 1.1编写目的 1.2项目背景 1.3参考资料 2系统总体设计 2.1整体架构 2.2整体功能架构 2.3整体技术架构 2.4运行环境设计 2.5设计目标 3系统功能模块设计 3.1个人办公 3.2系统管理 4性能设计 4.1响应时间 4.2并发用户数 5接口设计 5.1接口设计原则 5.2接口…

【word2pdf】Springboot word转pdf(自学使用)

文章目录 概要整体介绍具体实现官网pom文件增加依赖 遇到的问题本地运行OK&#xff0c;发布到Linux报错还是本地OK&#xff0c;但是Linux能运行的&#xff0c;但是中文乱码 小结 概要 Springboot word 转 pdf 整体介绍 搜了一下&#xff0c;发现了能实现功能的方法有四种 U…

手写一个简单的 OrbitControls 轨道控制器

手写一个简单的 OrbitControls 轨道控制器 相信使用过THREE.JS的同学&#xff0c;都知道 OrbitControls 这个的轨道控制器&#xff0c;他是绕着一个观察点&#xff0c;来进行什么什么的… 反正就是那么个意思。 所以很明显OrbitControls的运动轨迹是一个球体&#xff0c;他是绕…

Unity面经(自整)——Unity基础知识

Unity基础知识 1. Image和RawImage的区别 Image比RawImage更耗性能。Image只能使用sprite属性的图片。而RawImage什么都可以使用 2. Unity3D中的碰撞器Collider和触发器Trigger的区别 碰撞器是触发器的载体&#xff0c;而触发器是碰撞器上的一个属性。 如果IsTrigger为fal…

TDengine taosAdapter启用HTTPS

HTTPS &#xff08;Hypertext Transfer Protocol Secure &#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL&#xff0c;HTTPS 的安全基础是 SSL&#xff0c;因此加…

算法打卡day45|动态规划篇13| Leetcode 300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

算法题 Leetcode 300.最长递增子序列 题目链接:300.最长递增子序列 大佬视频讲解&#xff1a;300.最长递增子序列视频讲解 个人思路 没什么思路,菜就多练! 解法 动态规划 “子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而…

Razzashi Raptor

拉扎什迅猛龙 Razzashi Raptor 95000金&#xff08;游戏币&#xff09;比老虎便宜多了&#xff0c;捡漏啊 为啥我开团都不出&#xff0c;很生气&#xff0c;去打架&#xff01;&#xff01;

ArcGIS Desktop使用入门(三)图层右键工具——标注要素、将标注转换为注记

系列文章目录 ArcGIS Desktop使用入门&#xff08;一&#xff09;软件初认识 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——标准工具 ArcGIS Desktop使用入门&#xff08;二&#xff09;常用工具条——编辑器 ArcGIS Desktop使用入门&#xff08;二&#x…

【Godot4自学手册】第三十六节圆形移动或扇形移动的铁球

在第三十四节我实现了来回无限滚动的伤害铁刺球&#xff0c;这一节我准备实现一个圆形移动或扇形移动&#xff0c;并带有链条的铁球。效果如下&#xff1a; 一、实现原理 绕一点做圆周运动&#xff0c;简单的说就是&#xff1a; 每一帧根据旋转的角度计算出下一个位置的坐标…

Redis--16--Spring Data Redis

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Spring Data Redishttps://spring.io/projects/spring-data-redis 1.依赖2.RedisTemplate3.案例 序列化1.默认是 JdkSerializationRedisSerializer2.添加Redis配置文…

关于阿里云centos系统下宝塔面板部署django/中pip install mysqlclient失败问题的大总结/阿里云使用oss长期访问凭证

python版本3.12.0 项目的版本依赖 问题1 解决方案 sudo vim /etc/profile export MYSQLCLIENT_CFLAGS"-I/usr/include/mysql" export MYSQLCLIENT_LDFLAGS"-L/usr/lib64/mysql" Esc退出编辑模式 &#xff1a;wq退出并且保存 问题二 说是找不到 mysql.h头…

Html网页小游戏源代码

Html网页小游戏源代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Jello Jumping Game</title><meta name"viewport" content"widthdevice-width, initial-scale1"&…

[蓝桥杯] 岛屿个数(C语言)

提示&#xff1a; 橙色字体为需要注意部分&#xff0c;红色字体为难点部分&#xff0c;会在文章“重难点解答”部分精讲。 题目链接 蓝桥杯2023年第十四届省赛真题-岛屿个数 - C语言网 题目理解 这道题让我们求岛屿个数&#xff0c;那么我们就应该先弄懂&#xff0c;对于一…

基于小程序实现的医院预约挂号系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

如何访问远程MySQL数据库?

远程访问MySQL数据库是在不同设备之间实现数据交互的一种方式。通过远程访问&#xff0c;用户可以轻松地操作远程MySQL数据库&#xff0c;从而实现数据的读写、修改和查询等操作。本文将介绍远程访问MySQL数据库的原理和实现方法&#xff0c;以及一种被广泛应用的解决方案【天联…

MyBatis 中的动态 SQL 的相关使用方法

为什么会有动态SQL&#xff0c;把SQL写死不是比较方便吗&#xff1f;其实有很多的举例&#xff0c;这里我那一个常见的来说&#xff0c;像我们用户注册&#xff0c;会有必填字段和非必填字段&#xff0c;有些传来的参数不一样&#xff0c;那对应的SQL也不一样&#xff0c;因此&…

FluentUI系列 - 1 - 介绍第一个窗口

介绍一个QML的UI库&#xff0c;国人编写&#xff0c;作者也耍知乎。这个UI库确实好用&#xff0c;但是教程基本等于无&#xff0c;个人在使用中顺便记录一下学习内容。这玩意儿也有Pyside6的版本&#xff0c;有需要的可以查看PySide6-FluentUI-QML。 FluentUI库地址​github.c…

【MVCC】深入浅出彻底理解MVCC

MVCC概述 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制。主要是为了提高数据库的并发性能而提供的&#xff0c;采用了不加锁的方式处理读-写并发冲突&#xff0c;确保了任何时刻的读操作都是非阻塞的。只需要很小的开销&#xff0c;就可以…

ArcGIS Pro 3D建模简明教程

在本文中&#xff0c;我讲述了我最近一直在探索的在 ArcGIS Pro 中设计 3D 模型的过程。 我的目标是尽可能避免与其他软件交互&#xff08;即使是专门用于 3D 建模的软件&#xff09;&#xff0c;并利用 Pro 可以提供的可能性。 这个短暂的旅程分为三个不同的阶段&#xff1a;…