240702任伟超8.5作业

循环队列

1.头文件

 #ifndef __SEQUEUE_H__                                        
 #define __SEQUEUE_H__                                        
                                                              
 #define N 7      //容量为10,最多存储9个数据                 
                   //需要空出一个位置,让判满和判空条件不一致 
                                                              
 typedef int datatype;                                        
                                                              
 //声明一个结构体,存放数组和下标                             
 typedef struct                                               
 {                                                            
     datatype data[N];                                        
     int front;                                               
     int rear;                                                
 }Sequeue;                                                    
                                                              
 //创建一个空的循环队列                                       
 Sequeue* create_sequeue(void);                               
 //入队                                                       
 void insert_sequeue(Sequeue* sq, datatype num);              
 //出队                                                       
 datatype output_sequeue(Sequeue* sq);                        
 //遍历                                                       
 void show_sequeue(Sequeue* sq);                              
 //获取列表长度                                               
 int counrlen_sequeue(Sequeue* sq);                           
 //释放列表                                                   
 void free_sequeue(Sequeue** p);                              
                                                              
 #endif                                                       

2.功能函数

#include <stdio.h>                                                                                 
#include <stdlib.h>
#include "./03_sequeue.h"

int isFull_sequeue(Sequeue* sq);   //判满函数声明,如不想其他文件调用,加static限制成静态局部函数
//判空
int isNull_sequeue(Sequeue* sq);

//创建一个空的循环队列
Sequeue* create_sequeue(void)
{
    //申请一个Sequeue类型大小的堆空间
    Sequeue* sq = (Sequeue*)malloc(sizeof(Sequeue));
    if (NULL == sq)
    {
        printf("申请循环队列失败\n");
        return NULL;
    }
    //将队头和队尾赋值相等,且均为0
    sq->front = sq->rear = 0;

    return sq;
}

//判满
int isFull_sequeue(Sequeue* sq)
{
    return (sq->rear+1)%N == sq->front ? 1:0;
}

//入队
void insert_sequeue(Sequeue* sq, datatype num)
{
    //判断队列是否为满
    if( 1 == isFull_sequeue(sq))
    {
        printf("循环队列已满,无法入队\n");
        return ;
    }
    //将数据插入到队尾位置,即rear下标对应位置
    sq->data[sq->rear] = num;
    //更新队尾的下标位置,更新rear位置
    sq->rear = (sq->rear+1)%N;
    return ;
}

 //判空
 int isNull_sequeue(Sequeue* sq)                     
 {                                                   
     return sq->front == (sq->rear)%N ? 1:0;         
 }                                                   
                                                     
 //出队                                              
 datatype output_sequeue(Sequeue* sq)                
 {                                                   
     //判断队列是否为空                              
     if(1 == isNull_sequeue(sq))                     
     {                                               
         printf("循环队列为空,出队失败\n");         
         return (datatype)-1;                        
     }                                               
                                                     
     //将数据从队头获取出来                          
     datatype num = sq->data[sq->front];             
     //更新队头的下标位置,更新front位置             
     sq->front = (sq->front+1)%N;                    
     return num;                                     
 }                                                   
 //遍历                                              
 void show_sequeue(Sequeue* sq)                      
 {                                                   
     int i=0;                                        
     for(i=sq->front; i != sq->rear; i=(i+1)%N)      
     {                                               
         printf("%d ", sq->data[i]);                 
     }                                               
     putchar(10);                                    
                                                     
     return ;                                        
 }                                                   
                                                     
 //获取列表长度                                      
 int counrlen_sequeue(Sequeue* sq)                   
 {                                                   
     return ((sq->rear)-(sq->front)+N)%N;            
 }                                                   
                                                     
 //清空队列                                          
 void clean_sequeue(Sequeue* sq)                     
 {                                                   
     sq->rear = sq->front = 0;                       
     return ;                                        
 }                                                   

 //释放队列                                   
 void free_sequeue(Sequeue** p)               
 {                                            
     //p存储的是外部传入的sq的地址            
     //*p代表访问sq的空间                     
                                              
     //清空队列                               
     (*p)->rear = (*p)->front = 0;            
                                              
     //释放堆空间                             
     free(*p);                                
     (*p) = NULL;                             
     return;                                  
 }                                            

3.main函数

 #include <stdio.h>                           
 #include "./03_sequeue.h"                    
                                              
 int main(int argc, const char *argv[])       
 {                                            
     Sequeue* sq = create_sequeue();          
                                              
     insert_sequeue(sq, 10);                  
     insert_sequeue(sq, 20);                  
     insert_sequeue(sq, 30);                  
     insert_sequeue(sq, 10);                  
     insert_sequeue(sq, 20);                  
     insert_sequeue(sq, 30);                  
     insert_sequeue(sq, 40);                  
     show_sequeue(sq);                        
     int a=counrlen_sequeue(sq);              
     printf("a=%d\n", a);                     
                                              
     output_sequeue(sq);                      
     output_sequeue(sq);                      
     output_sequeue(sq);                      
     output_sequeue(sq);                      
     output_sequeue(sq);                      
     output_sequeue(sq);                      
     output_sequeue(sq);                      
     show_sequeue(sq);                        
     int b=counrlen_sequeue(sq);              
     printf("b=%d\n", b);                     
                                              
                                              
     return 0;                                
 }                                            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值