数据结构C语言实现系列——队列

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

typedef 
int  elemType;
/* ********************************************************************** */
/*                       以下是关于队列顺序存储操作的6种算法                */
/* ********************************************************************** */

struct  queue{
    elemType 
* queue;         /*  指向存储队列的数组空间  */
    
int  front, rear, len;     /*  队首指针(下标),队尾指针(下标),队列长度变量  */
    
int  maxSize;             /*  queue数组长度  */
};

void  againMalloc( struct  queue  * q)
{
    
/*  空间扩展为原来的2倍,原内容被自动拷贝到p所指向的存储空间中  */
    elemType 
* p;
    p 
=  realloc(q -> queue,  2   *  q -> maxSize  *   sizeof (elemType));
    
/*  动态存储空间分配,若失败则退出运行  */
    
if ( ! p){
        printf(
" 空间分配失败! " );
        exit(
1 );
    }
    q
-> queue  =  p;         /*  使queue指向新的队列空间  */
    
/*  把原队列的尾部内容后移maxSize个位置  */
    
if (q -> rear  !=  q -> maxSize  - 1 ){
        
int  i;
        
for (i  =   0 ; i  <=  q -> rear; i ++ ){
            q
-> queue[i + q -> maxSize]  =  q -> queue[i];
        }
        q
-> rear  +=  q -> maxSize;         /*  队尾指针后移maxSize个位置  */
    }
    q
-> maxSize  =   2   *  q -> maxSize;     /*  把队列空间大小修改为新的长度  */
    
return ;
}

/*  1.初始化队列  */
void  initQueue( struct  queue  * q,  int  ms)
{
    
/*  检查ms是否有效,若无效则退出运行  */
    
if (ms  <=   0 ){
        printf(
" ms值非法! " );
        exit(
1 );
    }
    q
-> maxSize  =  ms;         /*  置队列空间大小为ms  */
    
/*  动态存储空间分配,若失败则退出运行  */
    q
-> queue  =  malloc(ms  *   sizeof (elemType));
    
if ( ! q -> queue){
        printf(
" 内存空间分配失败! " );
        exit(
1 );
    }
    q
-> front  =  q -> rear  =   0 ;         /*  初始置队列为空  */
    
return ;
}

/*  2.向队列中插入元素x  */
void  enQueue( struct  queue  * q, elemType x)
{
    
/*  当队列满时进行动态生分配  */
    
if ((q -> rear  +   1 %  q -> maxSize  ==  q -> front){
        againMalloc(q);
    }
    q
-> rear  =  (q -> rear  +   1 %  q -> maxSize;         /*  求出队尾的下一个位置  */
    q
-> queue[q -> rear]  =  x;                         /*  把x的值赋给新的队尾  */
    
return ;
}

/*  3.从队列中删除元素并返回  */
elemType outQueue(
struct  queue  * q)
{
    
/*  若队列为空则终止运行  */
    
if (q -> front  ==  q -> rear){
        printf(
" 队列为空,无法删除! " );
        exit(
1 );
    }
    q
-> front  =  (q -> front  + 1 %  q -> maxSize;         /*  使队首指针指向下一个位置  */
    
return  q -> queue[q -> front];                     /*  返回队首元素  */
}

/*  4.读取队首元素,不改变队列状态  */
elemType peekQueue(
struct  queue  * q)
{
    
/*  若队列为空则终止运行  */
    
if (q -> front  ==  q -> rear){
        printf(
" 队列为空,无法删除! " );
        exit(
1 );
    }
    
return  q -> queue[(q -> front  + 1 %  q -> maxSize]; /*  队首元素是队首指针的下一个位置中的元素  */
}

/*  5.检查一个队列是否为空,若是则返回1,否则返回0  */
int  emptyQueue( struct  queue  * q)
{
    
if (q -> front  ==  q -> rear){
        
return   1 ;
    }
else {
        
return   0 ;
    }
}

/*  6.清除一个队列,并释放动态存储空间  */
void  clearQueue( struct  queue  * q)
{
    
if (q -> queue  !=  NULL){
        free(q
-> queue);
        q
-> queue  =  NULL;             /*  设置队列空间指针为空  */
        q
-> front  =  q -> rear  =   0 ;         /*  设置队列为空  */
        q
-> maxSize  =   0 ;                 /*  设置队列大小为0  */
    }
    
return ;
}

/* ********************************************************************** */

int  main( int  argc,  char *  argv[])
{
    
struct  queue q;
    
int  a[ 8 =  { 3 8 5 17 9 30 15 22 };
    
int  i;
    initQueue(
& q,  5 );
    
for (i  =   0 ; i  <   8 ; i ++ ){
        enQueue(
& q, a[i]);
    }
    printf(
" %d  " , outQueue( & q));    printf( " %d  " , outQueue( & q));
    enQueue(
& q,  68 );
    printf(
" %d  " , peekQueue( & q));    printf( " %d  " , outQueue( & q));
    
while ( ! emptyQueue( & q)){
        printf(
" %d  " , outQueue( & q));
    }
    printf(
" " );
    clearQueue(
& q);
    system(
" pause " );
    
return   0 ;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值