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

 

相关推荐

  1. [数据结构]串、数组 C++编程作业

    2024-07-10 03:18:02       43 阅读
  2. [数据结构] 栈和队列C++作业

    2024-07-10 03:18:02       38 阅读
  3. [数据结构]C++递归算法作业

    2024-07-10 03:18:02       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 03:18:02       49 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 03:18:02       53 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 03:18:02       41 阅读
  4. Python语言-面向对象

    2024-07-10 03:18:02       53 阅读

热门阅读

  1. C#——StringBuilder和string的区别与用法

    2024-07-10 03:18:02       20 阅读
  2. 《面向对象分析与设计》学习笔记1

    2024-07-10 03:18:02       22 阅读
  3. 人工智能与云计算

    2024-07-10 03:18:02       17 阅读
  4. 等保测评——云计算扩展项(云安全风险)

    2024-07-10 03:18:02       18 阅读
  5. iOS 开发者的 Flutter 入门课

    2024-07-10 03:18:02       22 阅读
  6. 认识同源策略

    2024-07-10 03:18:02       17 阅读
  7. LCD EMC 辐射 测试随想

    2024-07-10 03:18:02       17 阅读
  8. C# Halcon目标检测算法

    2024-07-10 03:18:02       21 阅读