数据结构作业/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 "…

《C++20设计模式》中单例模式

文章目录 一、前言二、饿汉式1、实现 三、懒汉式1、实现 四、最后 一、前言 单例模式定义&#xff1a; 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;其主要目的是确保一个类只有一个实例&#xff0c;并提供全局访问点来访问这个实例。…

mysql实战入门-基础篇

目录 1、MySQL概述 1.1、数据库相关概念 1.2、MySQL数据库 1.2.1、版本 1.2.2、下载 1.2.3、安装 输入MySQL中root用户的密码,一定记得记住该密码 1.2.4、启动停止 1.2.5、客户端连接 1.2.6、数据模型 2、SQL 2.1、SQL通用语法 2.2、SQL分类 2.3、DDL 2.3.1、数据…

GNU/Linux - Linux Kernel Device model

Linux 设备模型是 Linux 内核中的一个框架&#xff0c;它提供了一种统一、一致的方式来管理和表示硬件设备。设备模型抽象了硬件的细节&#xff0c;使得开发和维护驱动程序和子系统变得更加容易。以下是 Linux 设备模型的关键组成部分和概念&#xff1a; 关键组成部分 设备 (D…

算力感知网络系统架构模型、任务模型、 通信模型、计算和存储资源模型

目录 移动边缘计算——计算卸载 计算卸载 算力感知网络系统架构模型、任务模型、 通信模型、计算和存储资源模型 算力感知路由和算力资源分配 香农定理 1. 通信系统设计与优化 2. 数据压缩 3. 杂音抵消 4. 信道容量评估 香农公式计算 计算步骤 举例说明 传输信号的…

金融电商社交媒体等领域的大数据应用案例

大数据在各个行业都有广泛的应用&#xff0c;以下是几个典型领域的例子&#xff1a; 金融领域&#xff1a; 大数据帮助金融机构进行风险评估和信贷决策&#xff0c;通过收集和分析客户的交易历史、信用记录等信息&#xff0c;预测贷款违约率。例如&#xff0c;信用卡公司可以…

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

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

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

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

Python面试题:请解释什么是反射(reflection)?

在计算机科学中&#xff0c;反射&#xff08;reflection&#xff09;是指程序在运行时检查、修改和调用自身结构的能力。这种能力允许程序在运行时动态地获取有关其自身的信息&#xff08;如类、方法、属性等&#xff09;&#xff0c;并进行操作。反射通常用于创建灵活且可扩展…

idea集成本地tomcat

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

力扣1943.描述绘画结果

力扣1943.描述绘画结果 map存差分 遍历每组数据 加入res class Solution {public:vector<vector<long long>> splitPainting(vector<vector<int>>& segments) {map<int,long long> mp;for(auto t:segments){mp[t[0]] t[2];mp[t[1]] - t[…

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算…

JavaScript中的可选链操作符

在JavaScript中&#xff0c;?. 被称为可选链操作符&#xff08;Optional Chaining Operator&#xff09;。它允许你访问对象的深层属性而不必显式地检查每一层属性是否存在。如果链中的某个属性不存在&#xff0c;表达式将短路返回undefined&#xff0c;而不是抛出一个TypeErr…

鸿蒙语言基础类库:【@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…

sklearn中的Pipeline:构建无缝机器学习工作流

sklearn中的Pipeline&#xff1a;构建无缝机器学习工作流 在机器学习项目中&#xff0c;数据处理、模型训练和预测往往是一系列复杂且相互依赖的步骤。scikit-learn&#xff08;简称sklearn&#xff09;提供了一个强大的工具——Pipeline&#xff0c;用于将这些步骤组织成一个…