原题链接:蓝桥杯算法提高VIP-队列操作
#include <stdio.h>
#include <stdlib.h>
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 ;
}
}
9.9 分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复