作业/数据结构/2023/7/10

1.实现单向链表队列的,创建,入队,出队,遍历,长度,销毁。

main.c

#include "head.h"

int main(int argc, const char *argv[])
{
    //创建链式队列
    queue_ptr QL=create_queue();
    //入栈
    push(QL, 1000);
    push(QL, 1001);
    push(QL, 1002);
    push(QL, 1003);
    push(QL, 1004);
    //遍历 
    output(QL);
    //出队
    pop( QL);
    output(QL);
    //长度
    length(QL);
    //销毁 
    freedom(QL);
    return 0;
}                                     

head.h

#ifndef __HEAD_H__                
#define __HEAD_H__                
                                  
#include <stdio.h>                
#include <stdlib.h>               
//定义节点中的数据类型            
typedef int datatype;             
//定义节点结构体                  
typedef struct node               
{                                 
    union                         
    {                             
        int len;                  
        datatype data;            
    };                            
    struct node*next;             
}Node;                            
                                  
//定义链式队列结构体              
typedef struct seq                
{                                 
    Node *head;                   
    Node *tail;                   
}queue,*queue_ptr;                
                                  
                                  
                                  
                                  
//1.创建链式队列                  
queue_ptr create_queue();         
//2.判断为空操作                  
int empty(queue_ptr QL);          
//3.链式队列入队                  
int push(queue_ptr QL,datatype e);
//4.链式队列的遍历                
void output(queue_ptr QL);        
//5,链式队列的出队只能从对头删除  
void pop(queue_ptr QL);           
//6.长度                          
void length(queue_ptr QL);        
//销毁                            
void freedom(queue_ptr QL);       
#endif                            

 fun.c

 #include "head.h"                                     
                                                       
 //1.创建链式队列                                      
 queue_ptr create_queue()                              
 {                                                     
     //申请链式队列的结构体的大小空间                  
     queue_ptr QL=(queue_ptr)malloc(sizeof(queue));    
     //判断链式队列申请节点成功没有                    
     if(NULL==QL)                                      
     {                                                 
         printf("创建链式队列失败\n");                 
         return NULL;                                  
     }                                                 
                                                       
     //申请节点结构体的大小空间                        
     QL->head=(Node*)malloc(sizeof(Node));             
     //判断链式队列节点申请有没有成功                  
     if(NULL==QL->head)                                
     {                                                 
         printf("节点创建失败\n");                     
         free(QL);                                     
         return NULL;                                  
     }                                                 
                                                       
     //头节点创建成功                                  
     QL->head->len=0;//节点长度置0                     
     QL->head->next=NULL;//节点指针域指向NULL          
                                                       
     //链式队列结构体里面的指针指向                    
     QL->tail=QL->head;                                
                                                       
     printf("链式队列创建成功\n");                     
     return QL;                                        
 }                                                     
                                                       
                                                       
 //2.判断为空操作                                      
 int empty(queue_ptr QL)                               
 {                                                     
     if(QL==NULL)                                      
     {                                                 
         printf("判空操作失败\n");                     
         return -1;                                    
     }                                                 
     //当链式队列结构体的指针指向同一个节点            
         return QL->head==QL->tail;                    
 }                                                     
                                                       
                                                       
 //3.链式队列入队                                      
 int push(queue_ptr QL,datatype e)                     
 {                                                     
     if(QL==NULL)                                      
     {                                                 
         printf("入队失败\n");                         
         return 0;                                     
     }                                                 
                                                       
                                                       
                                                       
     //申请普通节点                                    
     Node *p=(Node*)malloc(sizeof(Node));              
     if(NULL==p)                                       
     {                                                 
         printf("申请节点失败\n");                     
         return 0;                                     
     }                                                 
     p->data=e;                                        
     p->next=NULL;                                     
                                                       
                                                       
                                                       
     //然后尾插                                        
     QL->tail->next=p;                                 
     QL->tail=p;                                       
     //长度自增                                        
     QL->head->len++;                                  
                                                       
     return 1;                                         
 }                                                     
                                                       
                                                       
 //4.链式队列的遍历                                    
 void output(queue_ptr QL)                             
 {                                                     
     if(NULL==QL ||empty(QL))                          
     {                                                 
         printf("遍历失败\n");                         
         return ;                                      
     }                                                 
     //循环遍历的指向的指针                            
     Node* q=QL->head;                                 
     while(q->next!=NULL)                              
     {                                                 
         q=q->next;                                    
         printf("%d  ",q->data);                       
     }                                                 
     printf("\n");                                     
 }                                                     
                                                       
                                                       
 //5,链式队列的出队只能从对头删除                      
 void pop(queue_ptr QL)                                
 {                                                     
     if(NULL==QL ||empty(QL))                          
     {                                                 
         printf("出队失败\n");                         
         return ;                                      
     }                                                 
                                                       
     //定义一个遍历指向队头指针                        
     Node*p=QL->head->next;                            
     //头指针指向下一节点                              
     QL->head->next=p->next;                           
     free(p);                                          
     p=NULL;                                           
     QL->head->len--;                                  
 }                                                     
                                                       
                                                       
 //6.长度                                              
 void length(queue_ptr QL)                             
 {                                                     
     if(NULL==QL)                                      
     {                                                 
         printf("输出长度失败\n");                     
         return ;                                      
     }                                                 
     int len=QL->head->len;                            
     printf("该顺序链式队列的长度为:%d\n",len);        
     return;                                           
 }                                                     
                                                       
 //销毁                                                
 void freedom(queue_ptr QL)                            
 {                                                     
     if(NULL==QL)                                      
     {                                                 
         printf("销毁失败\n");                         
         return ;                                      
     }                                                 
     while(QL->head->next!=NULL)                       
     {                                                 
         pop(QL);                                      
     }                                                 
     free(QL->head);                                   
     QL->head=NULL;                                    
     printf("销毁成功\n");                             
     return;                                           
}

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值