数据结构作业/2024/7/9

2>实现双向循环链表的创建、判空、尾插、遍历、尾删、销毁

fun.c

 #include "head.h"                                                 //1.双向循环链表的创建                                            doubleloop_ptr create_list()                                      {                                                                 //头结点的创立                                                doubleloop_ptr H=(doubleloop_ptr)malloc(sizeof(doubleloop));  if(NULL==H)                                                   {                                                             printf("创建双向循环链表失败\n");                         return NULL;                                              }                                                             H->len=0;                                                     H->next=H;                                                    H->prior=H;                                                   printf("双向循环链表创建成功\n");                             return H;                                                     }                                                                 //2.双向循环链表的判空                                            int empty(doubleloop_ptr H)                                       {                                                                 if(NULL==H)                                                   {                                                             printf("双向循环链表判空失败\n");                         return -1;                                                }                                                             return H->len==0;                                             }                                                                 //3.双向循环链表节点的创建                                        doubleloop_ptr node(datatype e)                                   {                                                                 //创建节点,堆区申请空间                                       doubleloop_ptr p=(doubleloop_ptr)malloc(sizeof(doubleloop));  if(NULL==p)                                                   {                                                             printf("节点创建失败\n");                                 return NULL;                                              }                                                             p->data=e;                                                    p->next=NULL;                                                 p->prior=NULL;                                                return p;                                                     }                                                                 //4.尾插                                                          int insert_tail(doubleloop_ptr H,datatype e)                      {                                                                 if(NULL==H)                                                   {                                                             printf("尾部插入失败\n");                                 return -1;                                                }                                                             doubleloop_ptr p=node(e);                                     //判断双向循环链表的表头后面是否有元素                        if(H->next==H&&H->prior==H)                                   {                                                             p->next=H;//直接相连                                      p->prior=H;                                               H->next=p;                                                H->prior=p;                                               }                                                             else                                                          {                                                             //定义一个指针q指向头结点然后循环到最后一个               doubleloop_ptr q=H;                                       for(int i=0;i<H->len;i++)                                 {                                                         q=q->next;                                            }                                                         p->prior=q;                                               p->next=H;                                                q->next=p;                                                H->prior=p;                                               }                                                             H->len++;                                                     return 1;                                                     }                                                                 //5.遍历                                                          int output(doubleloop_ptr H)                                      {                                                                 if(NULL==H || empty(H))                                       {                                                             printf("遍历结果失败\n");                                 return-1;                                                 }                                                             doubleloop_ptr p=H;                                           while(p->next!=H)                                             {                                                             p=p->next;                                                printf("%d  ",p->data);                                   }                                                             printf("\n");                                                 return 1;                                                     }                                                                 //6.尾删                                                          int del_tail(doubleloop_ptr H)                                    {                                                                 if(NULL==H || empty(H))                                       {                                                             printf("尾删失败\n");                                     return -1;                                                }                                                             doubleloop_ptr q=H;                                           for(int i=0;i<H->len;i++)                                     {                                                             q=q->next;                                                }                                                             q->prior->next=H;                                             H->prior=q->prior;                                            free(q);                                                      q=NULL;                                                       H->len--;                                                     return 1;                                                     }                                                                 //7.销毁链表                                                      int destory(doubleloop_ptr H)                                     {                                                                 if(NULL==H ||empty(H))                                        {                                                             printf("销毁双向链表失败\n");                             }                                                             //循环尾删链表                                                while(H->next!=H)                                             {                                                             del_tail(H);                                              }                                                             free(H);                                                      H=NULL;                                                       printf("链表已删除\n");                                       return 1;                                                     }                                                                 

main.c

#ifndef __HEAD_H__                                                  
#define __HEAD_H__                                                  #include <stdio.h>                                                  
#include <stdlib.h>                                                 //对结构体内部的数据类型重定义                                      
typedef int datatype;                                               //定义双向循环链表结构体                                            
typedef struct node                                                 
{                                                                   union//结构体内的共用体储存数据和长度                           {                                                               datatype data;//普通节点存储的数据                          int len;//头结点存储的长度数据                              };                                                              struct node* next;//定义结构体类型的指针                        struct node* prior;                                             
}doubleloop,*doubleloop_ptr;//双线循环链表类型重命名,及其指针重命名 //1.双向循环链表的创建                                              
doubleloop_ptr create_list();                                       
//2.双向循环链表的判空                                              
int empty(doubleloop_ptr H);                                        
//3.双向循环链表节点的创建                                          
doubleloop_ptr node(datatype e);                                    
//4.尾插                                                            
int insert_tail(doubleloop_ptr H,datatype e);                       
//5.遍历                                                            
int output(doubleloop_ptr H);                                       
//6.尾删                                                            
int del_tail(doubleloop_ptr H);                                     
//7.销毁链表                                                        
int destory(doubleloop_ptr H);                                      
#endif                                                              

 head.h

#include "head.h"int main(int argc, const char *argv[]
{//双向循环链表的创建doubleloop_ptr H=create_list();//尾插insert_tail(H,1000);insert_tail(H,1001);insert_tail(H,1003);insert_tail(H,1004);insert_tail(H,1005);insert_tail(H,1006);insert_tail(H,1007);insert_tail(H,1008);//遍历output(H);//尾删 del_tail(H);del_tail(H);del_tail(H);output(H);//释放destory(H);                      H=NULL;output(H);return 0;
}

 

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

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

相关文章

STM32实战篇:按键控制LED

按键控制LED 功能要求 有两个按键&#xff0c;分别控制两个LED灯。当按键按下后&#xff0c;灯的亮暗状态改变。实物如下图所示&#xff1a; 由图可知&#xff0c;按键一端直接接地&#xff0c;故另一端所对应IO引脚的输入模式应该为上拉输入模式。 实现代码 #include "…

PHP验证日本免费电话号码格式

首先&#xff0c;您需要了解免费电话号码的格式。 日本免费电话也就那么几个号段&#xff1a;0120、0990、0180、0570、0800等开头的&#xff0c;0800稍微特殊点&#xff0c;在手机号里面有080 开头&#xff0c;但是后面不一样了。 关于免费电话号码的划分&#xff0c;全部写…

【前端从入门到精通:第十二课: JS运算符及分支结构】

JavaScript运算符 算数运算符 关于自增自减运算 自增或者自减运算就是在本身的基础上进行1或者-1的操作 自增或者自减运算符可以在变量前也可以在变量后&#xff0c;但是意义不同 自增自减运算符如果在变量前&#xff0c;是先进行自增或者自减运算&#xff0c;在将变量给别人用…

idea集成本地tomcat

由于网课老师使用的是eclipse,但是……本人用的是idea,所以不得不去找教程。 解决方案1&#xff1a; https://blog.csdn.net/weixin_54048131/article/details/131359793 这个地方&#xff0c;路径一定要到这个tomcat 否则不识别&#xff1a; 这里的JRE也要配置一下 新问题&…

ESP32的I2S引脚及支持的音频标准使用说明

ESP32 I2S 接口 ESP32 有 2 个标准 I2S 接口。这 2 个接口可以以主机或从机模式&#xff0c;在全双工或半双工模式下工作&#xff0c;并且可被配置为 8/16/32/48/64-bit 的输入输出通道&#xff0c;支持频率从 10 kHz 到 40 MHz 的 BCK 时钟。当 1 个或 2 个 被配置为主机模式…

数据结构 实验 3

题目一&#xff1a;最短路径dijkstra算法 一、实验目的 熟练图的邻接矩阵和邻接表表示法掌握图的最短路径Dijkstra算法的基本思想用C语言实现Dijkstra算法 二、实验内容 从键盘输入的数据创建图&#xff08;图的存储结构采用邻接矩阵&#xff09;&#xff0c;设计Dijkstra算…

鸿蒙语言基础类库:【@ohos.util.Deque (线性容器Deque)】

线性容器Deque 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 Deque&#xff08;double ended queue&#xff09;根据循环队列的数据结构实现&#xff0c;符合先进先出以及先进后出的特点&…

Redis 实现高并发库存扣减方案

背景 公司的电商系统下单 操作库存是一个频繁操作&#xff0c;需要高效地扣减库存&#xff0c;把对销售库存的操作抽出来独立设计一个库存中心系统。 功能包括库存的批量添加、获取、下单、支付、回退等的操作。 解决的业务痛点 需要高效不超卖 方案 一、使用msql乐观锁 …

PostgreSQL 如何解决数据迁移过程中的数据类型不匹配问题?

文章目录 一、了解常见的数据类型不匹配情况1. 整数类型差异2. 浮点数类型差异3. 字符类型差异4. 日期和时间类型差异 二、解决数据类型不匹配的一般策略1. 数据转换2. 调整数据库表结构3. 数据清洗和预处理 三、PostgreSQL 中的数据类型转换函数1. 数值类型转换2. 字符类型转换…

解决虚拟机文件因快照占用硬盘空间较多的情况(压缩虚拟机文件,节省硬盘空间)

在使用虚拟机(Wmware)中&#xff0c;我们经常会在需要的时候拍摄虚拟机快照&#xff0c;尤其是虚拟机运行时的快照&#xff0c;动辄几个G&#xff0c;容易占满硬盘空间&#xff0c;那么有什么方法能够压缩虚拟机文件呢 下面是压缩后的存放虚拟机的文件夹 可以看到节约了大约2…

去除Win32 Tab Control控件每个选项卡上的深色对话框背景

一般情况下&#xff0c;我们是用不带边框的对话框来充当Tab Control的每个选项卡的内容的。 例如&#xff0c;主对话框IDD_TABBOX上有一个Tab Control&#xff0c;上面有两个选项卡&#xff0c;第一个选项卡用的是IDD_DIALOG1充当内容&#xff0c;第二个用的则是IDD_DIALOG2。I…

搜维尔科技:OptiTrack在NAB2024展示了一系列业界领先的媒体技术

广泛的显示和动作捕捉跟踪技术组合涵盖无与伦比的室内和室外 LED 解决方案、前沿技术演示以及最新的软件和硬件产品 可视化技术领域的全球领导者 Planar及其附属公司 3D 跟踪系统的全球领导者OptiTrack宣布&#xff0c;两家公司将在 2024 年全国广播协会 (NAB) 展会上展示其最全…

【fscan】Windows环境下的fscan安装与使用指南

Fscan是一款专为网络安全专业人士设计的多功能扫描工具&#xff0c;它能够帮助用户在Windows环境中执行高效的网络扫描任务。以下是关于Fscan的详细使用指南&#xff1a; 获取Fscan 要开始使用Fscan&#xff0c;首先需要从其GitHub仓库下载最新版本的预编译二进制可执行文件。…

Android布局简介

布局是一种可用于放置很多控件的容器&#xff0c;根据既定的规则决定内部控件的位置。当然&#xff0c;布局的内部也可以放置布局&#xff0c;即布局嵌套&#xff0c;布局嵌套可以实现一些比较复杂的界面。 Android中有多种编写程序界面的方式可供选择。Android Studio提供了相…

音视频质量评判标准

一、实时通信延时指标 通过图中表格可以看到&#xff0c;如果端到端延迟在200ms以内&#xff0c;说明整个通话是优质的&#xff0c;通话效果就像大家在同一个房间里聊天一样&#xff1b;300ms以内&#xff0c;大多数人很满意&#xff0c;400ms以内&#xff0c;有小部分人可以感…

Docker-compse的应用

1 docker-compose # 使用了docker 面临一个比较大的问题&#xff0c;如果一个djagno项目&#xff0c;使用mysql&#xff0c;redis&#xff0c;不要一次性把所有服务都放到一个容器中&#xff0c;每个服务一个容器&#xff0c;批量的管理多个容器&#xff0c;比较难以操作&…

go-redis源码解析:连接池原理

1. 执行命令的入口方法 redis也是通过hook执行命令&#xff0c;initHooks时&#xff0c;会将redis的hook放在第一个 通过hook调用到process方法&#xff0c;process方法内部再调用_process 2. 线程池初始化 redis在新建单客户端、sentinel客户端、cluster客户端等&#xff0c…

网站更新改版了

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a;Leo杂谈 ✨特色专栏&#xff1a;MySQL学…

大模型/NLP/算法面试题总结2——transformer流程//多头//clip//对比学习//对比学习损失函数

用语言介绍一下Transformer的整体流程 1. 输入嵌入&#xff08;Input Embedding&#xff09; 输入序列&#xff08;如句子中的单词&#xff09;首先通过嵌入层转化为高维度的向量表示。嵌入层的输出是一个矩阵&#xff0c;每一行对应一个输入单词的嵌入向量。 2. 位置编码&…

潜在空间可视化(Latent space visualization)

在“深度学习”系列中&#xff0c;我们不会看到如何使用深度学习来解决端到端的复杂问题&#xff0c;就像我们在《A.I. Odyssey》中所做的那样。我们更愿意看看不同的技术&#xff0c;以及一些示例和应用程序。 1、引言 上次&#xff08;Autoencoders - Deep Learning bits #…