数据结构中队列的链式储存结构的基本操作

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

/* 定义:front指针指向头结点,当front==rear时,表示空队列 */
 
typedef int QElemtype;
typedef struct QNode{
	QElemtype data;
	struct QNode *next;
}QNode,*QueuePtr;

typedef struct{
	QueuePtr front,rear;
	int size;  		//记录队列长度 
}LinkQueue;

//初始化 
void init_Queue(LinkQueue *Q)
{
	Q->front=(QueuePtr)malloc(sizeof(QNode));
	if(Q->front!=NULL)
	{
		Q->front->data=NULL;
		Q->front->next=NULL;
		Q->rear=Q->front;
		Q->size=0; 
		printf("OK\n");
	}
 } 
//入队 
void in_Queue(LinkQueue *Q,QElemtype e)
{
	QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
	if(p!=NULL)
	{
		p->data=e;
		p->next=NULL;
		Q->rear->next=p;
		Q->rear=p;
		Q->size++;
	 } 
 } 
//出队 
void out_Queue(LinkQueue *Q,QElemtype *e)
{
	if(Q->front==Q->rear)
	{ 
		printf("空队列\n");
	 	return;
	}
	QueuePtr p;
	p=Q->front->next;
	Q->front->next=p->next;
	*e=p->data;
	if(Q->rear==p)	//如果队列只有一个元素,则需要更改尾指针 
		Q->rear=Q->front;
	free(p);
	p=NULL;
	Q->size--;
}
//清空队列 
void clear_Queue(LinkQueue *Q)
{
	if(Q->front!=Q->rear)
	{
		QueuePtr p,q;
		p=Q->front->next;
		while(p!=NULL)
		{
			q=p->next;
			free(p);
			p=q;
		}
		Q->rear=Q->front;	 //不要忘记将尾指针重新指向头结点
		Q->rear->next=NULL;  //并将头结点的next指针赋值为空 
		Q->size=0;
	} 
	printf("OK\n");
 } 
//打印队列 
void print_Queue(LinkQueue *Q)
{
	if(Q->front==Q->rear)
	{
		printf("NULL\n");
		return; 
	 }
	QueuePtr p;
	p=Q->front->next;
	while(p!=NULL)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

int main()
{
	LinkQueue Q;
	int i;QElemtype e;
	while((i=getchar())!='#')		//按#号退出循环 
	{
		switch(i)
		{
			case '0':init_Queue(&Q);break;
			case '1':scanf("%d",&e);in_Queue(&Q,e);break;
			case '2':out_Queue(&Q,&e);break;
			case '3':clear_Queue(&Q);break; 
			case '4':print_Queue(&Q);break; 
			case '5':printf("当前队列长度为%d\n",Q.size); break; 
		}
	}
	return 0;
 } 

猜你喜欢

转载自blog.csdn.net/weixin_40908734/article/details/79250758