c语言编程题分队列,[蓝桥杯][算法提高VIP]队列操作-题解(C语言代码)

#include typedef int ElementType ;

typedef struct listnode

{

ElementType element ;

struct listnode *next ;

} NODE ;

typedef struct listqueue

{

struct listnode *front ;

struct listnode *rear ;

} queuePtr ;

typedef enum status

{

success = 0 ,

fail = 1 ,

TRUE = 3

} status ;

status InitQueue( queuePtr *pQHead);

status enQueue( queuePtr *pQHead , ElementType element);

status deQueue( queuePtr *pQHead , ElementType *pDeQueue_Val );

int getQueueLen(queuePtr *pQHead) ;

status Traversequeue(queuePtr *pQHead) ;

status isEmptyQueue( queuePtr *pQHead );

int main(int argc, char *argv[]) {

queuePtr *pQHead = (queuePtr *)malloc(sizeof(queuePtr));

int data = 0 ;

int cmdtype = 0 ;

int LenQueue = 0 ;

int n_cmd = 0 ;

InitQueue(pQHead) ;

scanf("%d",&n_cmd);

//while( scanf("%d",&cmdtype) != EOF )//这里可以控制输入多个命令

while( n_cmd-- )

{

scanf("%d",&cmdtype);

switch (cmdtype )

{

case 1 : scanf("%d",&data);

enQueue( pQHead , data );

break ;

case 2 :

if( deQueue( pQHead , &data) == success )

{

printf("%d\n",data);

}

else

{

printf("no\n") ;

return 0 ;//注意审题,如果下溢,输出no,并且退出

}

break ;

case 3 :

LenQueue = getQueueLen( pQHead );

printf("%d\n",LenQueue);

break ;

default :

//printf("invalid cmd!\n"); //调试使用

break ;

}

}

return 0;

}

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

* 刚开始创建空队列时,队列的队头和队尾指针相等都指向头结点,头结点的数据域不存放数据

* 第一次入队,创建新结点malloc,其数据域保存新插入元素,头结点的next指向新结点,(最后一句话很重要)

* 队列的头指针是固定指向头节点(但是头结点是不存放任何数据的)

* 第一次出队,则队列的队头指针指向头结点的next,依次类推

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

status InitQueue( queuePtr *pQHead)

{

//创建了头结点,但是头结点不存放任何数据的,这点需要注意。

NODE *headnode = (NODE *)malloc(sizeof(NODE));

headnode->next = NULL ;

headnode->element = 0 ;

pQHead->front = headnode ;

pQHead->rear = pQHead->front ;

if( NULL == pQHead->rear)

{

printf("malloc in InitQueue fail!");

return(fail);

}

return success ;

}

//特别注意:pQHead是一个指向指针的指针,front以及rear才是指向节点的指针

//当队列是空的时候,头指针以及尾指针指向一个空的节点(这点特别重要)

status enQueue( queuePtr *pQHead , ElementType element)

{

NODE *newnode = (NODE *)malloc(sizeof(NODE));

if( NULL == newnode )

{

printf("EnQueue fail,malloc error!");

return fail ;

}

else

{

newnode->element = element ;//将新数据录入新的节点

newnode->next = NULL ;

pQHead->rear->next = newnode ;//新节点接到尾部

pQHead->rear = newnode ;//新节点变成了尾部

return success ;

}

}

status deQueue( queuePtr *pQHead , ElementType *pDeQueue_Val )

{

if( isEmptyQueue(pQHead) == TRUE )

//if( pQHead->front->next == NULL )

{

//printf("deQueue-ing : empty queue!\n");

return fail ;

}

NODE *prefront = pQHead->front->next ;

*pDeQueue_Val = prefront->element ;

if( pQHead->rear == prefront )//判断队列空的方法:如果尾指针指向front的下一个节点,那么说队列中仅有一个节点

{

pQHead->rear = pQHead->front;

pQHead->front->next = NULL ;//这句话可以搭配使用 pQHead->front->next == NULL

}

else

{

pQHead->front->next = prefront->next ;

}

free(prefront);

prefront = NULL ;

return success ;

}

int getQueueLen(queuePtr *pQHead)

{

if( isEmptyQueue(pQHead) == TRUE )

{

//printf("Traverse-ing : empty queue!\n");

return 0 ;

}

NODE *tempnode = pQHead->front ;

int len = 1 ;

while( tempnode->next != pQHead->rear)//尾指针是空的

{

tempnode = tempnode->next ;

len ++ ;

}

tempnode = NULL ;

return len ;

}

//调试使用,用于输出队列的所有值

status Traversequeue(queuePtr *pQHead)

{

if( isEmptyQueue(pQHead) == TRUE )

{

//printf("Traverse-ing : empty queue!\n");

printf("no\n");

return fail ;

}

NODE *tempnode = pQHead->front->next ;

NODE *pretempnode = tempnode ;

while(tempnode != NULL )

{

printf("%d\n",tempnode->element);

tempnode = tempnode->next ;

}

return success ;

}

status isEmptyQueue( queuePtr *pQHead )

{

if( pQHead->front == pQHead->rear)

{

return TRUE ;

}

else

{

return fail ;

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值