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

news2025/1/9 21:53:13

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.coloradmin.cn/o/1912336.html

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

相关文章

面经-计算机网络-数据结构-堆

1.什么是堆 堆是一种满足以下条件的树&#xff1a; 堆中的每一个节点值都大于等于&#xff08;或小于等于&#xff09;子树中所有节点的值。或者说&#xff0c;任意一个节点的值都大于等于&#xff08;或小于等于&#xff09;所有子节点的值。 2.堆的用途 当我们只关心所有数…

Raylib 实现超大地图放大缩小与两种模式瓦片地图刷新

原理&#xff1a; 一种刷新模式&#xff1a; 在宫格内整体刷新&#xff0c;类似九宫格移动到边缘&#xff0c;则九宫格整体平移一个宫格&#xff0c;不过这里是移动一个瓦片像素&#xff0c;实际上就是全屏刷新&#xff0c;这个上限是 笔记本 3060 70帧 100*100个瓦片每帧都…

16:9横屏短视频素材库有哪些?横屏短视频素材网站分享

在这个视觉内容至关重要的时代&#xff0c;16:9横屏视频因其宽广的画面和优越的观赏体验&#xff0c;已经成为无数创作者和营销专家的首选格式。但要创造出吸引人的横屏视频&#xff0c;高质量的视频素材库是不可或缺的。不管你是资深视频制作人还是刚入行的新手&#xff0c;下…

香橙派编译linux内核支持ebpf和虚拟WIFI

前言 上一篇文章香橙派5plus上跑云手机方案一 redroid(带硬件加速)中说了怎么运行redroid&#xff0c;这篇补一下怎么修改参数编译内核。 补充 上篇文章有个内容需要补充一下&#xff1a;更新完内核需要用下面的命令防止内核被apt更新&#xff0c;不然后面使用apt update又回…

空间计量模型及 Stata 具体操作步骤

目录 一、引言 二、空间计量模型理论原理 空间自回归模型&#xff08;SAR&#xff09;&#xff1a; 空间误差模型&#xff08;SEM&#xff09;&#xff1a;&#xff0c; 空间杜宾模型&#xff08;SDM&#xff09;&#xff1a; 三、实证模型构建 四、数据准备 五、Stata …

怎么将几首音乐合并在一起?这四种合并方法大家都在用!

怎么将几首音乐合并在一起&#xff1f;在音乐的海洋中遨游时&#xff0c;我们是否曾被音乐的海洋所淹没&#xff1f;在享受旋律的流转中&#xff0c;我们是否频繁地在不同的曲目间穿梭&#xff0c;仿佛迷失在无尽的音符之中&#xff1f;但音乐数量的繁多&#xff0c;不仅带来了…

VMware vSAN替换存储解决方案如何选择?

What is vSAN &#xff1f; 是一款软件定义的企业存储解决方案&#xff0c;支持超融合基础架构系统。vSAN与VMware vSphere 完全集成在一起&#xff0c;作为ESXi Hypervisor内的分布式软件层&#xff0c;通过整合、池化ESXi各个主机上的存储资源&#xff0c;为vSphere虚拟化平…

【数据分享】1981—2023年中国逐日归一化植被指数(NDVI)栅格数据

NDVI&#xff0c;全名为Normalized Difference Vegetation Index&#xff0c;中文名称为归一化植被指数。这个指数可以用来定性和定量评价植被覆盖及其生长活力&#xff0c;我们也可以简单地将它理解为体现植被密度和健康状况的一个指标。 本次我们给大家分享的是1981年6月24日…

【计算几何】凸包问题 (Convex Hull)

【计算几何】凸包问题 (Convex Hull) 引言 凸多边形 凸多边形是指所有内角大小都在 [ 0 , π ] [0,π] [0,π]范围内的简单多边形 凸包 在平面上能包含所有给定点的最小凸多边形叫做凸包。 其定义为&#xff1a;对于给定集合 X&#xff0c;所有包含 X 的凸集的交集 S 被称…

苍穹外卖--编辑员工和根据id查询员工信息

查询员工信息 编辑员工 package com.sky.controller.admin;import com.sky.constant.JwtClaimsConstant; import com.sky.dto.EmployeeDTO; import com.sky.dto.EmployeeLoginDTO; import com.sky.dto.EmployeePageQueryDTO; import com.sky.entity.Employee; import com.sky…

oracle索引字段存储数据过长,导致索引失效

1&#xff1a;短位数据&#xff0c;索引生效 2&#xff1a;长位索引&#xff0c;索引不生效 此问题发现于6月中旬&#xff0c;线上问题优化。引以为戒。 解决&#xff1a; 并未解决索引不生效问题&#xff0c; 但是基于优化查询&#xff0c;是的查询保持毫秒级

21.呼吸灯拓展练习,控制四颗led以不同的频率“呼吸”

&#xff08;1&#xff09;Verilog代码&#xff1a; module ex_breath_led(clk,reset_n,led_out);input clk;input reset_n;output [3:0]led_out;reg [5:0]cnt_1us;reg [9:0]cnt_1ms;reg [10:0]cnt_2ms;reg [11:0]cnt_4ms;reg [12:0]cnt_8ms;reg [9:0]cnt_1s;reg overturn;par…

2024 Q3 NAND闪存价格|企业级依然猛涨,消费级放缓

在企业领域持续投资于服务器基础设施&#xff0c;特别是在人工智能应用的推动下&#xff0c;企业级SSD需求增加的同时&#xff0c;消费电子市场却依旧疲软。加之NAND供应商在2024年下半年积极扩大生产&#xff0c;预计到2024年第三季度&#xff0c;NAND闪存供应充足率将上升至2…

【CPP】CPP的命名空间输入输出缺省参数函数重载

目录 1 命名空间 -- namespace2 CPP的输入与输出(io)2.1 输入输出流的一些规定2.2 实操一下2.3 关于endl2.4 关于精度控制2.5 效率提高 3 缺省参数(默认参数)3.1 样例3.2 全缺省与半缺省3.3 缺省参数的意义 4 函数重载4.1 函数重载的基本使用4.2 函数重载调用歧义 这里是oldkin…

产品原型设计:从概念到实现的完整指南

如果你是一位产品经理&#xff0c;那么你一定会和原型图打交道&#xff0c;产品原型是产品设计方案和底层逻辑的可视化表达&#xff0c;需要完整清晰地表达出产品目的及需求&#xff0c;在整个产品创造的过程中发挥着不可或缺的作用。而对于一些刚入行的产品经理来说&#xff0…

Docker学习笔记(三)Dockerfile

一、什么是Dockerfile Dockerfile 是一个用于自动化构建 Docker 镜像的文本文件&#xff0c;其中包含了从一个基础镜像开始&#xff0c;到最终形成所需定制镜像的所有指令集。这个文件中的每一条指令都对应着构建镜像过程中的一个步骤或一层&#xff0c;指导 Docker 如何安装软…

tk 文本生成器

import random import tkinter as tk import ttkbootstrap as ttk from tkinter import messagebox import pyperclipdef wenben_run():def generate_text(original_text, length):# 去掉原始文本中的换行符和空格original_text original_text.replace(\n, )original_text or…

【文档智能】LACE:帮你自动生成文档布局的方法浅尝

前言 往期很多文章都介绍了【文档智能】上布局识别&#xff08;版式分析&#xff09;的技术思路&#xff0c;版式分析是通过对文档版式进行布局识别&#xff0c;识别文档中的元素类型的过程。这次来看看一个有趣的思路&#xff0c;通过已有的元素类型&#xff0c;来生成可控的…

解决安卓tv 蓝牙遥控器配对后输入法弹不出来的问题

t972在蓝牙配对后,自带的LatinIME 输入法会出现弹不出来的现象。 经过分析,主要为蓝牙的kl 文件适配存在问题。解决如下: 1.新建 kl文件Vendor_2b54_Product_1600.kl 放到 /vendor/usr/keylayout/下 内容: #for bl remote add by jason 20240709 key 113 VOLUME_MUTE …

【RAG KG】GraphRAG开源:查询聚焦摘要的图RAG方法

前言 传统的 RAG 方法在处理针对整个文本语料库的全局性问题时存在不足&#xff0c;例如查询&#xff1a;“数据中的前 5 个主题是什么&#xff1f;” 对于此类问题&#xff0c;是因为这类问题本质上是查询聚焦的摘要&#xff08;Query-Focused Summarization, QFS&#xff09…