数据结构双向循环链表

主程序

#include "fun.h"

int main(int argc, const char *argv[])
{
    double_p H=create_head();
    insert_head(H,10);
    insert_head(H,20);
    insert_head(H,30);
    insert_head(H,40);
    insert_tail(H,50);
    show_link(H);
    del_tail(H);
    show_link(H);
    free_link(H);
    H=NULL;
    show_link(H);
    
    
    return 0;
}

源程序

#include "fun.h"

//创建头节点
double_p create_head()
{
    double_p H=(double_p)malloc(sizeof(node));
    if(H==NULL)
    {
        printf("节点申请失败\n");
        return NULL;
    }
    H->prior=H;
    H->next=H;
    H->len=0;
    return H;
}

//创建新节点
double_p create_new(typdata data)
{
    double_p new=(double_p)malloc(sizeof(node));
    if(new==NULL)
    {
        printf("节点申请失败\n");
        return NULL;
    }
    new->prior=NULL;
    new->next=NULL;
    new->data=data;
    return new;
}
//判空
int empty_link(double_p H)
{
    if(H==NULL)
    {
        printf("入参为空,请检查\n");
        return -1;
    }
    return H->len==0;
}
//头插
void insert_head(double_p H,typdata data)
{
    if(H==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }

    
    double_p new=create_new(data);
    new->next=H->next;
    H->next=new;
    new->next->prior=new;
    new->prior=H;

    H->len++;
}
//遍历
void show_link(double_p H)
{
    if(H==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    if(empty_link(H))
    {
        printf("链表已空,无需遍历\n");
        return;
    }
    double_p p=H;
    while(p->next!=H)
    {
        p=p->next;
        printf("<-%d->",p->data);
    }
    putchar(10);
}
//尾插
void insert_tail(double_p H,typdata data)
{
    if(H==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    double_p p=H;
    while(p->next!=H)
    {
        p=p->next;
    }
    double_p new=create_new(data);
    new->next=p->next;
    p->next=new;
    new->prior=p;
    H->prior=new;


    H->len++;
}

//尾删
void del_tail(double_p H)
{
    if(H==NULL)
    {
        printf("入参为空,请检查\n");
        return;
    }
    if(empty_link(H))
    {
        printf("链表已空,无需删除\n");
        return;
    }
    
    double_p p=H;
    while(p->next->next!=H)
    {
        p=p->next;
    }
    free(p->next);
    p->next=NULL;
    p->next=H;
    H->prior=p;

    H->len--;
}
//释放链表
void free_link(double_p H)
{
    if(H==NULL)
    {
        printf("入参为空,请检查\n");
    } 
        while(H->next != H)
        {
           del_tail(H);
        }
    
        free(H);
        H=NULL;
        
    
       
    
}

                    头文件

#ifndef __FUN_H_
#define __FUN_H_

#include <myhead.h>

typedef int typdata;
typedef struct node
{
    union
    {
        typdata data;
        int len;
    };
    struct node * prior;
    struct node *next;
}node,*double_p;

double_p create_head();//创建头节点
double_p create_new(typdata data);//创建新节点
int empty_link(double_p H);//判空
void insert_head(double_p H,typdata data);//头插
void show_link(double_p);//遍历
void insert_tail(double_p H,typdata data);//尾插
void del_tail(double_p H);//尾删
void free_link(double_p H);//释放链表
#endif

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

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

相关文章

Python 传递参数和返回值

Python是一种功能强大的编程语言&#xff0c;它以其简洁和易用性而广受欢迎。在Python编程中&#xff0c;参数传递和返回值是函数调用中两个非常重要的概念。理解这些概念对于编写高效且可维护的代码至关重要。 一、参数传递 在Python中&#xff0c;函数参数可以通过以下几种…

Linux 网络时间同步:NTP 与 Chrony 的终极对决

Linux 网络时间同步&#xff1a;NTP 与 Chrony 的终极对决 在网络世界中&#xff0c;时间同步是一项至关重要的任务。无论是确保分布式系统的一致性&#xff0c;还是维护安全协议的完整性&#xff0c;准确的时间同步都是必不可少的。网络时间协议&#xff08;NTP&#xff09;和…

Golang期末作业之电子商城(源码)

作品介绍 1.网页作品简介方面 &#xff1a;主要有&#xff1a;首页 商品详情 购物车 订单 评价 支付 总共 5个页面 2.作品使用的技术:这个作品基于Golang语言&#xff0c;并且结合一些前端的知识&#xff0c;例如:HTML、CSS、JS、AJAX等等知识点&#xff0c;同时连接数据库的&…

统信UOS软件包标识化工具deepin-sbom-tools使用

原文链接&#xff1a;统信UOS上使用软件包标识化工具deepin-sbom-tools Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于在统信UOS上使用软件包标识化工具deepin-sbom-tools的文章。deepin-sbom-tools是一个强大的工具&#xff0c;可以帮助开发者和系统管理员更好…

Linux初始化新的git仓库

1.在git服务器上找到项目常部署的git地址可以根据其他项目的git地址确认 例如ssh://git192.168.10.100/opt/git/repository.git 用户名&#xff1a;git&#xff08;前面的是用户&#xff09; 服务器地址&#xff1a;192.168.10.100 git仓库路径&#xff1a;/opt/git/ 2.在服务器…

数据结构之折半查找

折半查找的算法思想&#xff1a; 折半查找又称二分查找&#xff0c;它仅仅适用于有序的顺表。 折半查找的基本思想&#xff1a;首先将给定值key与表中中间位置的元素&#xff08;mid的指向元素&#xff09;比较。midlowhigh/2&#xff08;向下取整&#xff09; 若key与中间元…

C#—Json序列化和反序列化

C#—Json序列化和反序列化 在C#中&#xff0c;可以使用System.Web.Script.Serialization.JavaScriptSerializer类来序列化和反序列化JSON数据。 可以使用Newtonsoft.Json库进行JSON的序列化。 可以使用.NET内置的System.Text.Json库来进行JSON的序列化。 json文件格式 [ { …

搜索引擎优化培训机构怎么选?这篇文章告诉你答案

搜索引擎优化&#xff08;SEO&#xff09;已成为网络生存必备技能。然而面对众多培训机构&#xff0c;如何选择优秀者&#xff1f;本文将为您揭晓此事&#xff0c;助您找到腾飞之地。 一、培训机构的多样性&#xff1a;琳琅满目的选择 当前SEO培训市场繁芜复杂&#xff0c;既…

C++ 八股(1)

C语言中strcpy为什么不安全&#xff1f;如何解决&#xff1f; 主要原因是缺乏对输入长度的边界检查&#xff0c;容易导致缓冲区溢出漏洞。 解决&#xff1a;可以使用strncpy函数替代&#xff0c;或者在程序最顶端加入代码段 #define _CRT_SECURE_NO_WARNINGS 缓冲区溢出 …

javascript高级部分笔记

javascript高级部分 Function方法 与 函数式编程 call 语法&#xff1a;call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义&#xff1a;调用一个对象的一个方法&#xff0c;以另一个对象替换当前对象。 说明&#xff1a;call 方法可以用来代替另一个对象调用一个方法。cal…

MySQL运维实战之ProxySQL(9.5)proxysql和MySQL Group Replication配合使用

作者&#xff1a;俊达 如果后端MySQL使用了Group Replication&#xff0c;可通过配置mysql_group_replication_hostgroups表来实现高可用 1 mysql_group_replication_hostgroups 字段描述writer_hostgroup写hostgroup。read_only和super_read_only OFF的节点。backup_writer…

Vue3 pdf.js将二进制文件流转成pdf预览

好久没写东西&#xff0c;19年之前写过一篇Vue2将pdf二进制文件流转换成pdf文件&#xff0c;如果Vue2换成Vue3了&#xff0c;顺带来一篇文章&#xff0c;pdf.js这个东西用来解决内网pdf预览&#xff0c;是个不错的选择。 首先去pdfjs官网&#xff0c;下载需要的文件 然后将下载…

第4章 IT服务规划设计

第4章 IT服务规划设计 4.1 概述 规划设计处于整个IT服务生命周期中的前端&#xff0c;可以帮助IT服务供方了解客户的需求&#xff0c;并对其进行全面的需求分析&#xff0c;然后通过对服务要素&#xff08;包括人员、资源、技术和过程&#xff09;、服务模式和服务方案的具体…

OpenHarmony4.x 系统模拟器环境

先下载源码和编译程序&#xff1a; 首先查看 OpenHarmony4.1源码下载、编译&#xff0c;生成OHOS_Image可执行文件的最简易流程 准备在QEMU模拟器中运行ARM Cortex-M4的轻型开源鸿蒙系统 官方支持的开发板和模拟器种类-编译形态整体说明OpenAtom OpenHarmony 已支持的示例工…

ArduPilot开源代码之AP_MSP

ArduPilot开源代码之AP_MSP 1. 源由2. Library设计2.1 启动代码2.2 支持特性2.3 MSP DisplayPort v.s. DJI FPV OSD 3. 重要例程3.1 AP_MSP::init3.2 AP_MSP::loop3.3 AP_MSP::init_backend 4. 实例理解5. 总结6. 参考资料 1. 源由 AP_MSP是处理MSP协议格式的报文数据应用类。…

反向业务判断逻辑

业务功能需求&#xff1a; 根据id扣减用户余额 包括&#xff1a;判断用户状态是否正常判断用户余额是否充足 正向逻辑&#xff1a; 判断用户为正常下&#xff0c;判断用户余额充足&#xff0c;进行余额扣减&#xff1b; 》正向逻辑&#xff0c;多重嵌套&#xff0c;代码不美观…

✈️一文带你入门【NestJS】

✈️引言 在现代Web开发领域&#xff0c;框架和技术的迭代速度令人咋舌。其中&#xff0c;NestJS作为一款基于Node.js的后端框架&#xff0c;以其卓越的设计理念和强大的功能集&#xff0c;迅速吸引了众多开发者的眼球。本文将带你深入了解NestJS的起源、发展&#xff0c;以及…

SpringIOC原理

SpringIOC原理 1.概念 Spring通过一个配置文件描述Bean及Bean之间的依赖关系&#xff0c;利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。Spring的IOC容器在完成这些底层工作的基础上&#xff0c;还提供了Bean实例缓存、生命周期管理、Bean实例代理、事件发布、…

AI提示词:AI辅导「数学作业」

辅导孩子作业对许多家长来说可能是一件头疼的事&#xff0c;但这部分工作可以在一定程度上交给AI来完成。 打开ChatGPT4,输入以下内容&#xff1a; # Role 数学辅导专家## Profile - author: 姜小尘 - version: 02 - LLM: Kimi - language: 中文 - description: 专门为小学生…

加密算法详解:对称加密、非对称加密、Hash算法

对称加密、非对称加密和哈希算法是信息安全中的三种主要加密技术&#xff0c;它们各自有不同的特点和用途&#xff1a; 对称加密&#xff08;Symmetric Encryption&#xff09; 工作原理&#xff1a;使用相同的密钥进行加密和解密。速度&#xff1a;通常非常快&#xff0c;适…