2021-11-07 链队列的基本操作

【问题描述】链队列Q,实现链队列的初始化、元素入队、出队等操作

typedef struct QNode{        //结点的定义                     
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

typedef struct{            //链队列的定义
    QueuePtr front;         //队头指针 front
    QueuePtr rear;          //队尾指针rear
}LinkQueue;    

   依次执行以下操作
    LinkQueue Q;             //定义队列Q
    InitQueue(&Q);       //初始化
    CreateQueue(&Q);     //元素依次入队
    DeQueue(&Q);      //执行一次出队
    QueueTraverse(&Q);   //遍历出队后的队列
    ClearQueue(&Q);      //清空链队列
    QueueTraverse(&Q);   //遍历空队列
 


【样例输入】7

                    12 59 56 53 62 5 50

【样例输出】59 56 53 62 5 50

【样例说明】队列长度为7,CreateQueue(&Q)函数实现12 59 56 53 62 5 50共7个元素依次入队Q,执行一次出队操作后,队列Q为:59 56 53 62 5 50

【运行结果如下】

【代码如下】

#include<stdio.h>
#include<stdlib.h>
#define OVERFLOW -1
#define ERROR -1
typedef int QElemType; 
typedef void Status; 


/*结点的定义*/
typedef struct QNode{                     
    QElemType data;
    struct QNode *next;
}QNode,*QueuePtr;

/*链队列的定义*/
typedef struct{
    QueuePtr front;         //队头指针
    QueuePtr rear;          //队尾指针
}LinkQueue;  

/*构造一个空队列*/
Status InitQueue(LinkQueue &Q)
{
	Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
	if (!Q.front) exit(OVERFLOW);	//存储分配失败 
	Q.front->next = NULL;
}

/*队列判空*/
bool QueueEmpty(LinkQueue &Q) 
{
	if (Q.front == Q.rear)
		return true;
	return false;
}

/*入队*/
Status EnQueue(LinkQueue &Q,QElemType e)
{
	QueuePtr p;	
	p = (QueuePtr)malloc(sizeof(QNode));	//创建结点 
	if (!p) exit(OVERFLOW);			//存储分配失败 
	p->data = e;	 
	p->next = NULL;		//指空 
	Q.rear->next = p;	//入队 
	Q.rear = p; 		//尾指针移动 
}
 
Status CreateQueue(LinkQueue &Q)
{
	QElemType i, j;
	QElemType count;	//元素个数 
	scanf("%d",&count);
	for(i = 0; i<count; i++) {
		scanf("%d",&j);
		EnQueue(Q,j);	//入队 
	}//for
}

/*出队*/
int DeQueue(LinkQueue &Q)
{
	QElemType e;
	QueuePtr pre;	//当前指针 
	if (Q.front == Q.rear) exit(OVERFLOW);	//队列为空 
	pre = Q.front->next;	//指向第一个结点 
	e = pre->data;
	Q.front->next = pre->next;	 
	if (Q.rear == pre)	//遇到最后一个结点时,将尾指针指向头结点 
		Q.rear = Q.front;
	free(pre);	//释放当前指针 
	return e;
}

/*清空链队列*/
Status ClearQueue(LinkQueue &Q)
{
	if(!QueueEmpty(Q))
		DeQueue(Q);		//队列不为空时,执行出队操作 
}

/*遍历队列*/
Status QueueTraverse(LinkQueue &Q)
{
	while (!QueueEmpty(Q)) {
		printf("%d ",DeQueue(Q));	//队列不为空时,输出队列中的元素 
	}	
}

int main() 
{
	LinkQueue Q;            //定义队列Q
    InitQueue(Q);       	//初始化
    CreateQueue(Q);     	//元素依次入队
    DeQueue(Q);      		//执行一次出队
    QueueTraverse(Q); 	 	//遍历出队后的队列
    ClearQueue(Q);      	//清空链队列
    QueueTraverse(Q); 		//遍历空队列
	return 0;
}

本文章仅供学习和参考!

欢迎交流~

Guess you like

Origin blog.csdn.net/m0_58489132/article/details/121189439