数据结构作业/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;
}

 

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

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

相关文章

如何在 PostgreSQL 中确保数据的异地备份安全性?

文章目录 一、备份策略1. 全量备份与增量备份相结合2. 定义合理的备份周期3. 选择合适的备份时间 二、加密备份数据1. 使用 PostgreSQL 的内置加密功能2. 使用第三方加密工具 三、安全的传输方式1. SSH 隧道2. SFTP3. VPN 连接 四、异地存储的安全性1. 云存储服务2. 内部存储设…

Spring Cloud 引入

1.单体架构&#xff1a; 定义&#xff1a;所有的功能实现都打包成一个项目 带来的后果&#xff1a; ①后端服务器的压力越来越大&#xff0c;负载越来越高&#xff0c;甚至出现无法访问的情况 ②业务越来越复杂&#xff0c;为了满足用户的需求&#xff0c;单体应用也会越来越…

C#Modbus通信

目录 1&#xff0c;辅助工具。 2&#xff0c;初识Modbus。 3&#xff0c;基于ModbusRTU的通信。 3.1&#xff0c;RTU与ASCII模式区别 3.2&#xff0c;Modbus存储区 3.3&#xff0c;报文格式 3.4&#xff0c;异常代码 3.5&#xff0c;详细文档连接 。 3.6&#xff0c;代…

数据结构——顺序表【C】

顺序表 1. 顺序表的概念以及结构1.1概念1.2静态顺序表和动态顺序表 2. 顺序表接口模拟实现接口总览2.1 初始化数据和销毁容器 2.2 顺序表的尾插和尾删2.3 头插和头删2.4 任意位置插入和删除数据2.5 查找数据 3. 顺序表的问题 &#xff1a; 1. 顺序表的概念以及结构 1.1概念 顺…

生成多个ssh访问不同git

如果&#xff0c;你的git代码仓库&#xff0c;比如说腾讯云coding&#xff0c;通过ssh秘钥访问&#xff0c;一直用的好好的&#xff0c;有一天&#xff0c;你又增加一个aliyun云效的代码仓库&#xff0c;又配置了aliyun云效的秘钥并且&#xff0c;根据aliyun云效的官方文档上传…

DOM(文档对象模型)生命周期事件

前言 DOM 生命周期事件涉及到从创建、更新到销毁 DOM 元素的不同阶段。 ● 我们来看下当HTML文档加载完再执行JavaScript代码 document.addEventListener(DOMContentLoaded, function (e) {console.log(HTML parsed adn DOM tree built!, e); })● 除此之外&#xff0c;浏览…

Elasticsearch详细介绍

B站对应视频&#xff1a; Elasticsearch01-01.为什么学习elasticsearch_哔哩哔哩_bilibili 大多数日常项目&#xff0c;搜索肯定是访问频率最高的页面之一。目前搜索功能是基于数据库的模糊搜索来实现的&#xff0c;存在很多问题。 首先&#xff0c;查询效率较低。 由于数据…

【work】AI八股-神经网络相关

Deep-Learning-Interview-Book/docs/深度学习.md at master amusi/Deep-Learning-Interview-Book GitHub 网上相关总结&#xff1a; 小菜鸡写一写基础深度学习的问题&#xff08;复制大佬的&#xff0c;自己复习用&#xff09; - 知乎 (zhihu.com) CV面试问题准备持续更新贴 …

如何在 SwiftUI 中开发定制 MapKit 功能

文章目录 介绍地图样式imagery-map 地图交互地图控件总结 介绍 在上一篇文章中&#xff0c;我们探讨了 SwiftUI 中新的 MapKit API 的基础知识。现在&#xff0c;让我们深入 MapKit API 的定制点&#xff0c;以便根据我们的需求定制地图呈现。 地图样式 新的 MapKit API 引入…

藏汉翻译通作为翻译软件的优势有哪些?

藏汉翻译通作为一款专业的藏汉双语翻译软件&#xff0c;具有以下优势&#xff1a; 人工智能技术应用&#xff1a;藏汉翻译通利用了人工智能翻译和语音识别合成技术&#xff0c;提供智能藏文翻译服务。 高准确率&#xff1a;文字识别准确率可达90%&#xff0c;语音识别转化文字…

pytest-yaml-sanmu(六):YAML数据驱动测试

如果说 pytest 中哪些标记使用得最多&#xff0c;那无疑是 parametrize 了&#xff0c; 它为用例实现了参数化测试的能力&#xff0c;进而实现了数据驱动测试的能力。 1. 使用标记 parametrize 的使用需要提高两个内容&#xff1a; 参数名 参数值 pytest 在执行用例时&…

【面试八股总结】线程基本概念,线程、进程和协程区别,线程实现

一、什么是线程&#xff1f; 线程是“轻量级进程”&#xff0c;是进程中的⼀个实体&#xff0c;是程序执⾏的最小单元&#xff0c;也是被系统独立调度和分配的基本单位。 线程是进程当中的⼀条执行流程&#xff0c;同⼀个进程内多个线程之间可以共享代码段、数据段、打开的文件…

MySQL手注之布尔型盲注详解

布尔型盲注简介 基于布尔型SQL盲注即在SQL注入过程中&#xff0c;应用程序仅仅返回True&#xff08;页面&#xff09;和False&#xff08;页面&#xff09;。 这时&#xff0c;我们无法根据应用程序的返回页面得到我们需要的数据库信息。但是可以通过构造逻辑判断&#xff08;…

同星智能正式推出CAN总线一致性测试系统

CAN总线一致性测试系统 CAN FD/CAN总线一致性测试系统&#xff0c;在硬件系统上基于同星自主研发的总线分析工具&#xff0c;干扰仪&#xff0c;一致性测试机箱&#xff0c;并搭配程控电源&#xff0c;示波器&#xff0c;数字万用表等标准外围仪器设备&#xff1b;在软件上基于…

算力狂飙|WAIC 2024上的服务器

7月7日&#xff0c;2024世界人工智能大会暨人工智能全球治理高级别会议&#xff08;WAIC 2024&#xff09;在上海落下帷幕。这场备受瞩目的AI盛宴与热辣夏日碰撞&#xff0c;吸引了全球科技、产业及学术界的广泛关注&#xff0c;线下参观人数突破30万人次&#xff0c;线上流量突…

【排序算法】快速排序(详解+各版本实现)

目录 一.交换排序 1.基本思想 2.冒泡排序 二.快速排序 1.hoare版本 2.挖坑法 3.前后指针版本 4.优化 优化①&#xff1a;三数取中 优化②&#xff1a;小区间优化 5.非递归版本 6.特性总结 ①效率 ②时间复杂度&#xff1a;O(N*logN) ③空间复杂度&#xff1a;O(l…

【vue】JSON数据导出excel

前言 导出方式有很多种&#xff0c;但是若只需要数据导出成.xlsx文件并下载的话&#xff0c;只用xlsx一个插件就行 目标 1 实现数据导出excel 2 如何设置表格列宽 3 如何在文件中创建工作表 准备工作 1 安装 npm i xlsx -S 2 引入 npm i xlsx -S 二、导出excel 创建文件 con…

【IMU】 温度零偏标定

温度标定 IMU的零偏随着温度的变化而变化&#xff0c;在全温范围内形状各异&#xff0c;有些可能是单调的&#xff0c;有些可能出现拐点。 多项式误差温度标定 目的是对估计的参数进行温度补偿&#xff0c;获取不同温度时的参数值&#xff08;零偏、尺度、正交&#xff09;&…

C++笔试强训3

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、选择题1-5题6-10题 二、编程题题目一题目二 一、选择题 1-5题 如图所示&#xff0c;如图所示p-3指向的元素是6&#xff0c;printf里面的是%s&#xff0c;从6开…

LLM应用构建前的非结构化数据处理(一)标准化处理认识数据

1.学习内容 本节次学习内容来自于吴恩达老师的Preprocessing Unstructured Data for LLM Applications课程&#xff0c;因涉及到非结构化数据的相关处理&#xff0c;遂做学习整理。 2.相关环境准备 2.1 建议python版本在3.9版本以上 chromadb0.4.22 langchain0.1.5 langcha…