数据结构(C语言)实现循环队列

//头文件

#ifndef QUENE_H_INCLUDED
#define QUENE_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CQSIZE 4

typedef int ElemType ;

typedef struct
{
    ElemType* Qbase ;
    ElemType* front ;
    ElemType* rear ;
} CirculQuene ;

int InitQuene( CirculQuene* Q ) ;
int DestroyQuene( CirculQuene* Q ) ;
int IsEmptyQuene( CirculQuene* Q ) ;
int ClearQuene( CirculQuene* Q ) ;
int GetHeadQuene( CirculQuene* Q  , ElemType* e ) ;
int GetLengthQuene( CirculQuene* Q ) ;
int InsertQuene( CirculQuene* Q , ElemType e ) ;
int DeleteQuene( CirculQuene* Q , ElemType* e ) ;
int TraverseQuene( CirculQuene* Q ) ;


#endif // QUENE_H_INCLUDED

//函数实现

 

#include "quene.h"

int InitQuene( CirculQuene* Q )
{
    Q->Qbase = ( ElemType* )malloc( CQSIZE * sizeof( ElemType ) ) ;
    if( !Q->Qbase )
    {
        printf( "OVERFLOW!\n") ;
        exit( 1 ) ;
    }
    memset( Q->Qbase , 0 ,CQSIZE * sizeof( ElemType ) ) ;
    Q->front = Q->Qbase ;
    Q->rear = Q->Qbase ;
    return 0 ;
}

int DestroyQuene( CirculQuene* Q )
{
    ElemType* p = Q->Qbase ;
    ElemType* q =NULL ;
    Q->front = NULL ;
    Q->rear = NULL ;
    while( p < Q->Qbase + CQSIZE )
    {
        q = p++ ;
        free( q ) ;
    }
    free( Q->Qbase ) ;
    return 0 ;
}

int IsEmptyQuene( CirculQuene* Q )
{
    if( Q->front == Q->rear )
    {
        return 1 ;
    }
    return 0 ;
}

int ClearQuene( CirculQuene* Q )
{
    Q->front = Q->Qbase ;
    Q->rear = Q->Qbase ;
    memset( Q->Qbase , 0 , CQSIZE * sizeof( ElemType ) ) ;
    return 0 ;
}

int GetHeadQuene( CirculQuene* Q  , ElemType* e )
{
    *e = *Q->front ;
    return 0 ;
}

int GetLengthQuene( CirculQuene* Q )
{
    return ( Q->rear - Q->front + 1 +CQSIZE ) / CQSIZE ;
}

int InsertQuene( CirculQuene* Q , ElemType e )//分类依据:是否是最后一个,是否满
{
    if( Q->rear != Q->Qbase + CQSIZE - 1 )
    {
        if( Q->rear +1 != Q->front )
        {
            *Q->rear++ = e ;
        }
        else
        {
            printf( "The quene is full!\n" ) ;
            exit( 1 ) ;
        }
    }
    else
    {
        if( Q->front == Q->Qbase )
        {
            printf( "The quene is full!\n" ) ;
            exit( 1 ) ;
        }
        else
        {
            *Q->rear = e ;
            Q->rear = Q->Qbase ;
        }
    }
    return 0 ;
}

int DeleteQuene( CirculQuene* Q , ElemType* e )
{
    if( IsEmptyQuene( Q ) )
    {
        printf( "The quene is empty , fail to delete !\n" ) ;
        exit( 1 ) ;
    }
    else
    {
        *e = *Q->front ;
        if( Q->front == Q->Qbase + CQSIZE - 1 )
        {
            Q->front = Q->Qbase ;
        }
        else
        {
            Q->front++ ;
        }
    }
    return 0 ;
}

int TraverseQuene( CirculQuene* Q )
{
    if( !Q->Qbase )
    {
        printf( "OVERFLOW!\n" ) ;
        exit( 1 ) ;
    }
    ElemType* p = Q->front ;
    while( p != Q->rear )
    {
        if( p == Q->Qbase + CQSIZE - 1 )
        {
            printf( "%d\t" , *p ) ;
            p = Q->Qbase ;
        }
        else
        {
            printf( "%d\t" , *p++ ) ;
        }

    }
    return 0 ;
}

//主函数测试

#include "quene.h"

int main()
{
    CirculQuene Q ;
    ElemType e = 0 ;
    InitQuene( &Q ) ;
    InsertQuene( &Q , 3 ) ;
    InsertQuene( &Q , 5 ) ;
    InsertQuene( &Q , 7 ) ;
    DeleteQuene( &Q , &e ) ;
    DeleteQuene( &Q , &e ) ;
    InsertQuene( &Q , 9 ) ;
    InsertQuene( &Q , 9 ) ;
    //InsertQuene( &Q , 5 ) ;
    printf( "%d\n" , e ) ;
    TraverseQuene( &Q ) ;
    return 0;
}

//欢迎批评指正

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值