欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构——队列的链表实现

程序员文章站 2022-07-14 12:13:46
...

数据结构——队列的链表实现

队列:队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头,队列又称为“先进先出”。

操作:利用链表的形式,对队列进行初始化,入队,出队,遍历队列。

#include<stdio.h>
#include<stdlib.h>
#define ERROR -1
#define OK 1
#define OVERFLOW 0
typedef int QElemType;
typedef int 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;
	return OK;
}

//入队列
Status EnterQueue(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;
	return OK;
}

//出队列
Status PopQueue(LinkQueue &Q,QElemType &e)
{
	QueuePtr p;
	if(Q.front ==Q.rear )
	{
		printf("队列为空,无法出队列!\n");
		return ERROR;
	}
	p=Q.front ->next ;
	e=p->data ;
	Q.front ->next =p->next ;
	if(Q.rear ==p)
	{
		Q.rear =Q.front ;
	}
	free(p);
	return OK;
}

//遍历队列
void PrintQueue(LinkQueue &Q)
{
	QNode *p;
	printf("遍历已输入数据的队列:");
    for(p=Q.front->next;p!=NULL;p=p->next)
	{
			printf("%d ",p->data);
	}
}

int main()
{
	LinkQueue Q;
	int x,n;
	InitQueue(Q);
	printf("请输入队列的元素个数:\n");
	scanf("%d",&n);
	while(n--!=0)
	{
		printf("请输入队列元素:\n");
		scanf("%d",&x);
		EnterQueue(Q,x);//入队列
		PrintQueue(Q);//遍历队列
		printf("\n");
	}
	printf("\n出队列一个元素\n");
	PopQueue(Q,x);
	printf("%d\n",x);
	return 0;
}

若代码有错误的地方或是其他代码,请各位指教。

相关标签: 数据结构