C语言 带头双向循环链表的基本操作

带头双向循环链表的基本操作

  • 结构体定义
  • 初始化
  • 创建新节点
  • 头插
  • 头删
  • 尾插
  • 尾删
  • 查找
  • 在指定位置之后插入
  • 删除指定位置的值
  • 打印

结构体定义

typedef int DataType;
typedef struct LinkNode
{
    DataType data;
    struct LinkNode* prev;
    struct LinkNode* next;
}LNode;

初始化

有两种初始化方式
第一种你需要在main函数里或者全局定义一个LNode* phead,注意,只需要定义就可以了,然后再调用Init(&phead);

为什么要传地址呢?
因为在Init函数内部我们需要对phead进行操作(分配空间),那么一旦需要对参数进行操作,那就不能只穿本身,而要传地址。

void Init(LNode** pphead)
{
    *pphead=(LNode*)malloc(sizeof(LNode));
    (*pphead)->data=-1;
    (*pphead)->next=(*pphead)->prev=*pphead;
}

这一种的话,不需要在main函数里创建,直接调用Init_1()函数就行。

void Init_1()
{
    LNode* phead=(LNode*)malloc(sizeof(LNode));
    phead->data=-1;
    phead->prev=phead->next=phead;
}

初始化以后,头结点就是这样子了:
在这里插入图片描述

创建新节点

函数参数为DataType类型

LNode* CreateNode(DataType x)
{
    LNode* newnode=(LNode*)malloc(sizeof(LNode));
    newnode->prev=newnode->next=NULL;//这个地方也将prev和next初始化为newnode自身
    //因为这两个指针后续都会改变方向,因此初始状态无所谓。
    return newnode;
}

头插

这里的头插指的是在第一个有效节点之前插入,也就是插入到head的后一个。

我们第一步先把新节点的prev和next设置好,因为这样做不影响链表结构,肯定先把简单的搞了嘛~
在这里插入图片描述在这里插入图片描述然后再修改head->next和head->next->prev(图中1号节点)的指向,至于这两个谁先谁后,那就无所谓了。

在这里插入图片描述
头插完以后就是这个样子了

void PushHead(LNode* phead,DataType x)
{
    LNode* new=CreateNode(x);
    new->next=phead->next;
    new->prev=phead;
    phead->next->prev=new;
    phead->next=new;
}

头删

头删需要注意的一个点就是判断是否只剩下了一个节点,有些题目会要求头删直至为NULL,有的会要求删到只剩最后一个,我们这里以后者为例
在这里插入图片描述先这么改
在这里插入图片描述再这么改(这两步顺序可以变)
在这里插入图片描述最后再释放掉new节点就可以了(当然考试的时候不释放也行,平时养成这个习惯还是很好的!)

void DelHead(LNode* phead)
{
    if(phead->next==phead)
        return;
    else
    {
        LNode* tmp=phead->next;
        phead->next=tmp->next;
        tmp->next->prev=phead;   
        free(tmp);     
    }
}

尾插

尾插其实就是在头结点的前一个插,所以简单程度可想而知:

void PushBack(LNode*phead,DataType x)
{
    LNode*new=CreateNode(x);
    new->next=phead;
    new->prev=phead->prev;
    phead->prev->next=new;
    phead->prev=new;
}

尾删

跟刚才尾插一个道理,就是头结点的前一个。

void DelBack(LNode*phead)
{
    LNode* tmp=phead->prev;
    phead->prev=tmp->prev;
    tmp->prev->next=phead;
    free(tmp);
}

查找

查找的时候,有时候对查找的开始位置可能也有限制。如果是带头的双循环链表比较好办,如果是不带头的,如果要从phead开始查找,那么开始访问位置cur就得是phead->prev;
我们这里介绍从phead的next开始访问的情况,其他情况趋同,只需要改变初始访问指针cur的值就可以

LNode* Find(LNode* phead,DataType x)
{
    LNode* cur=phead->next;
    while(cur!=phead)
    {
        if(cur->data==x)
            return cur;
        cur=cur->next;
    }
    return NULL;
}

在指定位置之后插入

跟头插简直一模一样,就是把参数换了个名儿

void Insert(LNode* pos,DataType x)
{
    LNode* new=CreateNode(x);
    new->next=pos;
    new->prev=pos->prev;
    pos->prev->next=new;
    pos->prev=new;
}

删除指定位置的值

跟刚才头删尾删一样,有些题可能需要删到最后一个为止

void DelPos(LNode* pos)
{
    if(pos->next=pos)
        return;
    else
    {
        LNode* front=pos->prev;
        LNode* after=pos->next;
        front->next=after;
        after->prev=front;
    }
}

打印

这个地方比较巧妙,如果想让phead的值第一个被打印,那么循环就要用do while 因为如果用了while(cur!=phead),那么循环完全进不去,因为访问指针cur的初始值就为phead,用do while可以先执行一次,执行完之后cur的指向就不再是phead了,然后再判断循环条件。

void Print(LNode* phead)
{
    LNode* cur=phead;
    do
    {
        printf("%d ",cur->data);
        cur=cur->next;
    } while (cur!=phead);
    
}

有两道非常好的双向循环链表的题推荐给大家:
link
这是我写的我们学校作业的题解,
空闲空间申请模拟和 ***文件加密!***这两道题都用到了循环链表,但是比刚刚的基础操作要复杂很多,但是基本的思想都是大差不差的,我在本文中提到的一些注意事项,在这两道题中都有体现,比如说开始访问位置,判断是否为空等等,大家如果想要提高一下可以去看看那两道题哈~

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

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

相关文章

ssm珠宝店信息管理系统-计算机毕业设计源码87229

摘 要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用。简单的流程、便捷可靠的支付方式、快捷畅通的物流快递、安全的信息保护都使得电子商务越来越赢得网民们的青睐。现…

ip地址快速切换软件有哪些好处

ip地址快速切换软件有哪些好处?IP地址快速切换软件具有诸多显著的好处,以下是对其主要优势的详细阐述: 首先,IP地址快速切换软件极大地提升了网络活动的灵活性和便捷性。对于需要经常切换网络环境或进行多账号管理的用户而言&…

程序员日志之地下城与勇士手游

目录 传送门正文日志1、概要2、手游特点3、主C升级3、九大职业4、打造-史诗毕业装备5、打造-毕业史诗装备封印属性6、打造-徽章6.1、普通徽章6.2、白金徽章6.3、银色徽章 7、打造-魔力结晶8、打造-附魔9、打造-勋章9.1、公会勋章9.2、冒险勋章9.3、团本勋章 10、打造-称号11、打…

远控免杀篇

0x00:前言 随着近两年hvv和红蓝对抗以及国家对于网络安全的重视,国内防护水平都蹭蹭上了一个台阶,不管是内部人员的技术水平提高还是防护设备的层层部署,均给了红队人员想要进一步行动设置了障碍。 通过weblogic的cve-2019-2725获…

Pipeline管道

目录 一、介绍二、为什么使用pipeline1.读入数据集2、数据预处理1、缺失值、重复值处理2、数据编码、标准化 3、分割数据集4、模型训练、预测5、调参:网格搜索6、模型保存7、预测新进用户 三、pipeline示例1、读取数据2、数据处理1、数据类型拆分2、分类变量处理3、…

第二证券今日投资参考:猪价趋势上行 电网工程投资力度有望加强

上星期五,两市股指盘中窄幅震动上扬,尾盘翻绿。到收盘,沪指跌0.16%报3086.81点,深证成指跌0.22%报9364.38点,创业板指跌0.44%报1805.11点,两市算计成交7149亿元。工作方面,传媒、轿车、半导体、…

酷开科技丨将运动进行到底!酷开系统开启家庭健身新风尚

随着健康生活方式的普及,健身已经成为了许多人日常生活的重要部分。在这种情况下,居家健身成为了一个非常方便实用的健康生活方式。健身是一种享受,一种与自己独处的方式。它让我们有机会聆听身体的声音,感受心灵的平静&#xff0…

ElasticSearch高级搜索深入,聚合查询深入

文章目录 一、相关性和相关性得分1、概述2、相关性(Relevance)3、什么是TF-IDF4、BM255、通过Explain API查看TF-IDF6、Boosting 二、bool查询1、概述2、bool查询语法3、如何解决结构化查询“包含而不是相等”的问题4、利用bool嵌套实现should not逻辑 三…

CST电磁仿真软件表面等离子极化激元SPP --- 一维光栅耦合 - 衍射模式, 效率, Floquet端口

这两期我们看一下衍射光栅的高阶衍射、衍射效率、反射率。具体到仿真设置,就是Floquet端口的模式分析,S参数与衍射效率和反射率的关系。那么研究这些衍射和表面等离子极化激元SPP有什么关系呢?关系可大了,光栅是一种能够用来激励出…

促进设备缺陷闭环管理,引入智能巡检系统正当时

经过近些年的应用与发展,智能巡检系统的功能与可操作性已经非常成熟,在巡检工作整合管理、与其他系统调用对接、促进设备缺陷闭环管理方面的优秀表现,使其在安全管理工作中的发挥了超预期的工具价值。 一、巡检工作整合管理 设备巡检管理、安…

前端JS必用工具【js-tool-big-box】学习,检测密码强度

js-tool-big-box 前端工具库,实用的公共方法越来越多了,这一小节,我们带来的是检测密码强度。 我们在日常开发中,为了便于测试,自己总是想一个简单的密码,赶紧输入。但到了正式环境,我们都应该…

Redis连接池

本次实现的Redis连接池是一个单例且多线程安全的连接池。 主要实现的功能为:读取配置,将配置中对应建立redis连接并加入到连接池中,然后从连接池中取出连接使用。每当配置进行修改,重新往池子中加入连接。 通用类 实现一些基础都…

记一次cms代码审计

000:前言 记录一次小型cms代码审计 001:任意文件删除 由于代码繁杂,不再一一展示 /app/controller/kindeditor.class.php 关键漏洞代码 public function delete() {$path ROOT_PATH.$_GET[pic];unlink($path);$flash M("flash&qu…

冶金比例换向阀放大器

冶金比例换向阀是一种重要的液压控制元件,它通过BEUEC比例放大器驱动调节阀门开度来精确控制流量,进而控制压力或速度。在液压系统中,比例阀的接线设备是确保其正常工作和实现精确控制的关键部分。比例阀的接线方式主要包括电流输入和电压输入…

Unix、Linux 软件包管理快速入门对照

Linux(RHEL、Ubuntu)或者 Unix(macOS、FreeBSD)可以参看下表快速入门: 命令功能/系统Darwin (macOS)FreeBSDDebian/UbuntuRHEL(dnf yum)搜索和查找软件包brew searchpkg searchapt listyum list查看软件包…

基于python flask+pyecharts实现的中药数据可视化大屏,实现基于Apriori算法的药品功效关系的关联规则

背景 在中医药学中,物品与功效之间的关联关系研究是一个非常重要的课题。传统中医药学中,很多药物都具有多种功效,而且不同药物对同一种疾病可能具有不同的疗效。因此,挖掘物品与功效之间的关联关系,可以帮助我们更加…

WIN系统 -> 以太网未识别的网络问题

1.方法1 2. 3. 根据诊断提示解决问题。 方法2. 右键以太网属性

Java mybatis

nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for proper 注意 mapper 中,insert into values 中 values 字段和 Java 对象保持一直

快速排序的实现

目录 一、递归 1、霍尔法: 2、挖坑法: 3、前后指针法: 二、非递归 三、完整代码: 基本思想: 先取这个待排序元素序列中的某一个元素最为key值,然后通过这个key值将这个序列分为两边,一边小…

vue-2

vue-cli的安装 vue-cli是一个脚手架工具,它集成了诸多前端技术,包括但不仅限于: webpack、 babel、eslint、http-proxy-middleware、typescript、css pre-prosessor、css module、… 这些工具,他们大部分都要依赖两个东西&…