队列2

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

typedef 
int  elemType;
/* ********************************************************************** */
/*                     以下是关于队列链接存储操作的6种算法                */
/* ********************************************************************** */
struct  sNode{
    elemType data;            
/*  值域  */
    
struct  sNode  * next;         /*  链接指针  */
};
struct  queueLK{
    
struct  sNode  * front;     /*  队首指针  */
    
struct  sNode  * rear;         /*  队尾指针  */
};

/*  1.初始化链队  */
void  initQueue( struct  queueLK  * hq)
{
    hq
-> front  =  hq -> rear  =  NULL;         /*  把队首和队尾指针置空  */
    
return ;
}

/*  2.向链队中插入一个元素x  */
void  enQueue( struct  queueLK  * hq, elemType x)
{
    
/*  得到一个由newP指针所指向的新结点  */
    
struct  sNode  * newP;
    newP 
=  malloc( sizeof ( struct  sNode));
    
if (newP  ==  NULL){
        printf(
" 内存空间分配失败!  " );
        exit(
1 );
    }
    
/*  把x的值赋给新结点的值域,把新结点的指针域置空  */
    newP
-> data  =  x;
    newP
-> next  =  NULL;
    
/*  若链队为空,则新结点即是队首结点又是队尾结点  */
    
if (hq -> rear  ==  NULL){
        hq
-> front  =  hq -> rear  =  newP;
    }
else {     /*  若链队非空,则依次修改队尾结点的指针域和队尾指针,使之指向新的队尾结点  */
        hq
-> rear  =  hq -> rear -> next  =  newP;         /*  注意赋值顺序哦  */
    }
    
return ;
}

/*  3.从队列中删除一个元素  */
elemType outQueue(
struct  queueLK  * hq)
{
    
struct  sNode  * p;
    elemType temp;
    
/*  若链队为空则停止运行  */
    
if (hq -> front  ==  NULL){
        printf(
" 队列为空,无法删除!  " );
        exit(
1 );
    }
    temp 
=  hq -> front -> data;         /*  暂存队尾元素以便返回  */
    p 
=  hq -> front;                 /*  暂存队尾指针以便回收队尾结点  */
    hq
-> front  =  p -> next;         /*  使队首指针指向下一个结点  */
    
/*  若删除后链队为空,则需同时使队尾指针为空  */
    
if (hq -> front  ==  NULL){
        hq
-> rear  =  NULL;
    }
    free(p);        
/*  回收原队首结点  */
    
return  temp;     /*  返回被删除的队首元素值  */
}

/*  4.读取队首元素  */
elemType peekQueue(
struct  queueLK  * hq)
{
    
/*  若链队为空则停止运行  */
    
if (hq -> front  ==  NULL){
        printf(
" 队列为空,无法删除!  " );
        exit(
1 );
    }
    
return  hq -> front -> data;         /*  返回队首元素  */
}

/*  5.检查链队是否为空,若为空则返回1, 否则返回0  */
int  emptyQueue( struct  queueLK  * hq)
{
    
/*  判断队首或队尾任一个指针是否为空即可  */
    
if (hq -> front  ==  NULL){
        
return   1 ;
    }
else {
        
return   0 ;
    }
}

/*  6.清除链队中的所有元素  */
void  clearQueue( struct  queueLK  * hq)
{
    
struct  sNode  * =  hq -> front;         /*  队首指针赋给p  */
    
/*  依次删除队列中的每一个结点,最后使队首指针为空  */
    
while (p  !=  NULL){
        hq
-> front  =  hq -> front -> next;
        free(p);
        p 
=  hq -> front;
    }    
/*  循环结束后队首指针已经为空  */
    hq
-> rear  =  NULL;         /*  置队尾指针为空  */
    
return ;
}

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

int  main( int  argc,  char *  argv[])
{
    
struct  queueLK q;
    
int  a[ 8 =  { 3 8 5 17 9 30 15 22 };
    
int  i;
    initQueue(
& q);
    
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 " );
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值