数据结构双向循环链表

主程序

#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;函数参数可以通过以下几种…

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++ 八股(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…

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;、服务模式和服务方案的具体…

✈️一文带你入门【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: 专门为小学生…

Elasticsearch:Node.js ECS 日志记录 - Morgan

这是之前系列文章&#xff1a; Elasticsearch&#xff1a;Node.js ECS 日志记录 - Pino Elasticsearch&#xff1a;Node.js ECS 日志记录 - Winston 中的第三篇文章。在今天的文章中&#xff0c;我将描述如何使用 Morgan 包针对 Node.js 应用进行日子记录。此 Morgan Node.j…

包装器 std::function

使用前&#xff0c;包头文件&#xff1a;#include <functional> std::function 是 C标准库 中的一个通用函数包装器&#xff1b; 它可以储存、复制、调用任何可调用的对象&#xff0c;包括&#xff1a;函数指针、成员函数、绑定的成员函数、lambda表达式、仿函数等。 1…

Selenium Grid- 让自动化分布式执行变得可能

什么是 Selenium Grid&#xff1f; Selenium Grid 是 Selenium 的三大组件之一&#xff0c;允许用户同时在不同的机器和系统上测试不同浏览器。 也就是说 Selenium Grid 支持分布式的测试执行。它可以让你的测试用例在一个分布式的执行环境中运行。 由上图可见&#xff0c;测试…

大话光学原理:4.散射:瑞利、拉曼、米氏和布里渊

这是一缕柔和的光&#xff0c;在空气的舞台上轻盈地跳跃。它悠然自得&#xff0c;在宁静的空间中缓缓前行。然而&#xff0c;一片细薄透明的介质挡住了它的脚步&#xff0c;它毫无预兆地撞上了这片障碍。在这短暂的接触中&#xff0c;它被分解成无数微小的粒子&#xff0c;被迫…

增强现实(AR)与虚拟现实(VR)的区别?

随着科技的飞速发展&#xff0c;增强现实&#xff08;AR&#xff09;与虚拟现实&#xff08;VR&#xff09;技术在各个领域展现出巨大的潜力和应用前景。这两种技术虽然在体验和实现方式上有所不同&#xff0c;但都为用户提供了全新的感知体验。本文将详细解析AR和VR的概念、区…

机器视觉/自然语言/生成式人工智能综合应用实验平台-实训平台-教学平台

AIGC是人工智能1.0时代进入2.0时代的重要标志&#xff0c;MIT 科技评论也将Al合成数据列为2022年十大突破性技术之一&#xff0c;甚至将生成性Al(Generative Al) 称为是AI领域过去十年最具前景的进展。同时&#xff0c;AIGC领域岗位需求数量暴涨。高校方面在人工智能专业与机器…

tensorflow张量生成以及常用函数

张量tensor&#xff1a;多维数组&#xff08;列表&#xff09; 阶&#xff1a;张量的维数 维数 阶 名字 例子 0-D 0 标量 scalar s 1&#xff0c; 2&#xff0c; 3 1-D 1 向量 vector…

How do I format markdown chatgpt response in tkinter frame python?

题意&#xff1a;怎样在Tkinter框架中使用Python来格式化Markdown格式的ChatGPT响应&#xff1f; 问题背景&#xff1a; Chatgpt sometimes responds in markdown language. Sometimes the respond contains ** ** which means the text in between should be bold and ### te…