C语言双向循环链表的生成,删除和打印

双向循环链表的讲解及实现(图解+代码/C语言) 本文主要分享了双向循环链表(带头)的写法,使用C语言完成,文中附有具体的结构图片帮助大家理解,希望对大家有帮助 阅读详情
#include <stdio.h>
#include <stdlib.h>

typedef struct dnode
{
    int data;
    struct dnode *prior;
    struct dnode *next;
}dnode;

dnode *add(dnode *dhead);
dnode *del(dnode *dhead);
void printdnode(dnode *dhead);

int main()
{
    int sel=0;
    dnode *dhead=NULL;
    while(1)
    {
        printf("\t1:添加\n\t2:删除\n\t3:查看\n\t4:退出\n");
        scanf("%d",&sel);
        switch(sel)
        {
            case 1:
                dhead=add(dhead);
                printdnode(dhead);
                break;
            case 2:
                dhead=del(dhead);
                printdnode(dhead);
                break;
            case 3:
                printdnode(dhead);
                break;
            case 4:
                exit(0);
            default:
                printf("reinput 1-4\n");
                break;    
        }
    }

    return 0;
}

dnode *add(dnode *dhead)
{
    int x=0;
    dnode *s=NULL;
    dnode *p=NULL;

    printf("请输入节点数据:\n");
    scanf("%d",&x);
    s=(dnode *)malloc(sizeof(dnode));
    s->data=x;
    if(NULL==dhead)
    {
        dhead=s;
        s->next=s;
        s->prior=s;
    }
    else
    {
        p=dhead;

        //先找到添加的位置
        while(1)
        {
            if(s->data>p->data)
            {
                p=p->next;
                if(p==dhead)
                {
                    break;
                }
            }
            else
            {
                break;
            }
        }
        //插入到p节点的前面
        p->prior->next=s;
        s->prior=p->prior;
        s->next=p;
        p->prior=s;
    }
    return dhead;
}

dnode *del(dnode *dhead)
{
    int x=0;
    dnode *p=NULL;
    if(NULL==dhead)
    {
        printf("dlist empty\n");
        return NULL;
    }

    printf("请输入删除的数据:\n");
    scanf("%d",&x);
    p=dhead;

    //找到需要删除数据的地址
    while(1)
    {
        if(p->data==x)
        {
            break;
        }
        p=p->next;
        if(p==dhead)
        {
            printf("no this data in dlist\n");
            return dhead;
        }
    }

    if(dhead==p)
    {
        dhead=dhead->next;
    }
    p->prior->next=p->next;
    p->next->prior=p->prior;

    if((dhead->next==dhead)&&(dhead->prior=dhead)&&(dhead->data==x))
    {
        free(dhead);
        dhead=NULL;
        p=NULL;
    }
    else
    {
        free(p);
        p=NULL;
    }



    return dhead;
}

void printdnode(dnode *dhead)
{
    if(NULL==dhead)
    {
        printf("dlist empty\n");
        return;
    }

    dnode *p=NULL;
    p=dhead;
    while(1)
    {
        printf("%d ",p->data);
        p=p->next;
        if(p==dhead)
        {
            break;
        }
    }
    printf("\n");
}
C语言详解双向链表的基本操作 双链表的定义与接口函数 定义双链表 接口函数 详解接口函数的实现 创建新节点(BuyLTNode) 初始化双链表(ListInit) 双向链表打印(ListPrint) 双链表查找(ListFind) 双链表销毁(ListDestory) 1、双链表pos位置之前插入(ListInsert) 2、双链表删除pos位置(ListEarse) 3、双向链表尾插(ListPushBack) 4、双向链表头插(ListPushFront) 5、双链表头删(ListPopF....... 阅读详情

相关推荐

C语言实现双向循环链表

C语言实现双向循环链表 一、双向循环链表的结构 以三个节点为例,双向循环链表结构如上图所示。每个节点都分为数据域和指针域,数据域是存储数据的;指针域存储前向指针和后向指针,前向指针指向该节点的上一个节点,后向指针指向该节点的下一个节点。循环链表是指首尾要相连,即第一个节点的前向指针指向最后一个节点,最后一个节点的后向指针指向第一个节点,形成一个环。 二、实现一个双向循环链表 1. 首先创建一个双...

f1443369600的博客 2078

双向链表-----------(c语言)

基本实现双向循环链表的增删查改,并且还完成了部分代码的优化复用,减少代码量,测试过程出现的诸多问题可以自己解决就这样,开溜,如果大佬们发现有什么bug,可以私信找我。

sdmdnf的博客 682

Qualcomm工具的使用

简介   由于我们公司主要是以高通平台为主,所以工具的使用是必不可少的,包括QPST、QRCT3、QXDM、QDART等。   高通工具顾名思义就是,对于高通平台的软件开发进行软件的烧录,软件的调试,软件的Log的抓取和分析过程,像我们平常用的大致就是烧版本、改NV、制作QCN、然后校准、强发强收等操作。 QPST   QPST主要是用来做一些参数的配置,包括EFS文件的编辑,QCN的导入和备份与...

Jimmy 2万+

双向循环链表

双向链表

qq1053984219的博客 334

Tessent MBIST SDC

主要是两个PROC,tessent_constrain_${design_name}_mentor_ijtag_non_modal和tessent_constrain_${design_name}_mentor_memory_bist_modal。其中,Memory/MBIST controller/MEM Interface可以从func_clk_1来(用func_clk_1和func_clk_2的高频时钟),如图中红色线。其中,SIB和BAP用ijtag_tck的clock,如图绿色线。

po_poo的博客 1987

ESP32-C3芯片通过蓝牙控制开锁功能

定义BLE服务和特征,用于接收开锁命令。0x00FF// 服务UUID0xFF01// 特征UUID4// 句柄数量// 特征值// 特征属性// 处理GATT服务器事件// 处理事件(详细代码见下文)// 注册GATT回调if (ret) {return;// 创建GATT服务器。

m0_46145044的博客 920

[C语言数据结构]双向循环链表

上次我们学习了单链表的实现,相对于双向循环链表来说,单链表的各中操作,比如说增删查改等都显得非常麻烦。所以接下来来学习一下双向循环链表吧!

本科在读,致力于Linux/C++方向的学习,同时涉及数据结构与算法,操作系统,数据库mysql等等 2230

GNSS接收机性能测试全攻略:从实验室到真实场景

本文系统介绍了GNSS接收机从实验室到真实场景的完整性能测试流程。首先通过GNSS模拟器进行射频传导测试,评估接收机的基础性能;其次进行天线OTA测试,考察整机系统表现;最后通过精心设计的外场路测,在复杂环境中验证其实际定位精度与可靠性。文章强调,只有结合可控的实验室验证与多变的外场挑战,才能对接收机性能做出全面、真实的评价。

weixin_28365523的博客 512

C语言数据结构篇——单循环链表的创建,插入,节点删除,打印等操作

初识循环链表

Demo不是emo的博客 1万+

电脑卸载神器Revo Uninstaller Pro,彻底清残留,终身无限制使用

打开软件后,它会自动扫描并列出电脑里所有已安装的程序,小到各种插件、大到专业设计软件和驱动程序,哪怕是隐藏的系统组件,都能给你扒出来,还会自动分类整理,加上搜索功能能快速定位目标软件,就算是电脑小白,也能轻松上手。卸载彻底无残留:能直接代替系统自带的 “添加 / 删除程序”,不光能正常卸载软件,还会通过内置卸载程序配合残留扫描,把软件留下的残留文件、垃圾还有注册表项都扫得明明白白,扫描强度有三档可以选,想清理得多干净都能自己定,删除之后电脑立马清爽不少。电脑用久了是不是越来越慢?

qq_75153390的博客 1742

Android 14安装的APK默认允许运行时权限

本文介绍了在Android系统中实现安装应用后自动授予运行时权限的方法。通过在安装完成广播中检测应用安装状态,调用新增的DefaultPermissionGrantPolicy.grantAppRuntimePermissions()函数来授予常规权限,并使用allowSpecialPermission()处理特殊权限(如安装未知应用和悬浮窗权限)。文章详细说明了如何修改DefaultPermissionGrantPolicy类,添加grantAppRuntimePermissions和grantRunti

热衷于Android Framework和系统APP的修改经验分享 683

c语言循环链表打印出来,C语言双向循环链表的生成,删除和打印

#include typedef struct dnode{int data;struct dnode *prior;struct dnode *next;}dnode;dnode *add(dnode *dhead);dnode *del(dnode *dhead);void printdnode(dnode *dhead);int main(){int sel=0;dnode *dhead=N...

weixin_39534002的博客 258

国科大《人工智能原理与算法》2021年期末试题+2024经验(2025指南)

2021年期末试题+24年复习指南

MatsumotoChrikk 2926

【数据结构与算法】(6):带头结点的双向循环链表

带头结点的双向循环链表

更新C/C++,数据结构与算法,计算机视觉,深度学习,目标检测 5245

【25届数字IC秋招总结】面试经验13——豪威科技面试

25届数字ic面试记录———豪威科技

lalala0635的博客 362

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【吉大刘大有数据结构绿皮书】约瑟夫问题:旅游代理商选择了n个顾客来竞争最后的免费环游世界大奖。代理商让顾客们排成一个圆圈,然后从帽子里抽出一个数字m(1<=m<=n)。游戏开始后,代理商按顺时针方向绕

旅游代理商选择了n个顾客来竞争最后的免费环游世界大奖。代理商让顾客们排成一个圆圈,然后从帽子里抽出一个数字m(1

随手写写 867

android 蓝牙通讯demo

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

【C语言数据结构】双向循环链表

目录 前言 一、双向循环链表 循环结构 1.双向循环链表头文件及函数声明 2.初始化 1.结点构造 2.初始化函数 3.结点申请 4.数据插入 1.按位置插入 2.尾插 3.头插 5.查找 6.数据删除 1.按位置删除 2.按值删除 3.尾删 4.头删 7.清空与销毁 1.清空 2.销毁 8.双向循环链表源文件及整体函数实现 总结 前言 这次我们将学习双向循环链表,首先了解双向链表和循环链表的定义和讲解。 双向链表也叫双链...

W1024201的博客 7316

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

数据结构——带头双向循环链表(c语言实现)

我们在前几期详细地讲解了不带头单向不循环链表(单链表),使用它的底层代码实现了一个简单的通讯录项目,也介绍了链表分为八种,但是其中最常用的只有两种:(1)不带头单向不循环链表,(2)带头双向循环链表,今天我们要讲解的就是第二种带头双向循环链表。

qq_58761784的博客 4372

从零开始实现一个双向循环链表:C语言实战

在计算机科学中,链表是一种常见的数据结构,它通过节点之间的指针连接来存储数据。链表有许多变种,其中双向循环链表因其独特的结构而备受关注。今天,我们将通过C语言实现一个双向循环链表,并探讨其核心操作。无论你是数据结构的新手,还是想巩固基础的老手,这篇文章都将为你提供实用的知识和代码示例。首先,我们需要定义链表节点的结构。每个节点包含三个部分:data:存储节点的数据。next:指向下一个节点的指针。prev:指向前一个节点的指针。} LTNode;

Giants2024的博客 3059

如何实现双向循环链表

用C语言实现双向带头循环链表,通过概念的渗透和代码的逐一分析进行讲解。

kevin_blog 1687

【DS】C语言实现带头双向循环链表(详细图解)

图解详细解析双向链表的构建

Mesar的博客 1053

双向循环链表讲解及实现

文章目录一.带头双向循环链表二.实现(1).动态申请一个结点 一.带头双向循环链表 带头双向循环链表:结构最复杂,一般用在单独存储数据。实际中使用的链表数据结构,都是带头双向循环链表。另外这个链表虽然结构复杂,但是使用代码实现以后会发现能带来很多优势. 二.实现 Lish.h中部分声明 (1).动态申请一个结点 ...

DR5200的博客 1万+

【C语言数据结构】双链表详解(带头双向循环链表)

我们把要存放的数据类型重命名,接着定义一个含有三个参数的结构体,分别用于存放数据,指向下一节点与指向上一节点。}ListNode;我们在进行插入操作以及建立头节点的时候都需要进行申请节点的操作,因此我们可以把它分装成一个函数。不管是进行插入还是删除操作,我们都需要传入哨兵位头节点,我们可以把哨兵位头节点的创立也分装成一个函数。然后剩下的的就是链表的通用功能:增删查改,pos位置的插入与删除以及链表的销毁。//双链表申请一个新节点// 创建返回链表的头结点// 双向链表打印。

谁在夜里看海.的博客 3730

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

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

outdated_socks的博客 5406

双向循环链表增删查改C语言实现

目录双向链表的结构双向链表的实现双向链表的声明双向链表的实现结点的创建头结点的创建链表的销毁链表的打印链表的尾插链表的尾删链表的头插链表的头删查找指定位置前插入指定位置删除 双向链表的结构 双向链表: 每个结点存在两个指针域,分别存储该结点的前驱结点引用和后继结点引用,从任意一个结点出发,都能通过前驱引用以及后继引用完成整个链表结点的访问。 所以不难看出,单向链表能干的事,双向链表也能干!但是正是因为这一特性,相比于单链表,双向链表在访问其他结点上带来方便的同时,将占用更多的资源,因此在使用的时候可.

m0_53421868的博客 1436

【C语言】实现双向链表

正文开始:在实际应用中,常用的双向链表是双向带头循环链表,本文考虑到实际应用,目的也是实现双向带头循环链表。

石墨博客 4537
上一篇: C语言实现约瑟夫环,使用循环单链表和循环数组2种方法
下一篇: C语言单链表的3种排序算法,插入排序,冒泡排序,选择排序
卫水金波
博客等级 码龄12年 73粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值