数据结构之链队列的实现


/**********************链队列********************/

#include"stdio.h"
#include"stdlib.h"
#define ERROR 0
#define OK 1
#define FALSE 0
#define TRUE 1
typedef int ElemType;
typedef int Status;
typedef struct QNode
{
	ElemType data;
	struct QNode *next;
}QNode,*QueuePtr;

typedef struct
{
	QueuePtr front,rear;
}LinkQueue;

/*********************Operator***************/

void InitQueue(LinkQueue *Q)				//初始化队列
{	
	Q->front=Q->rear=NULL;
}


void ClearQueue(LinkQueue *Q)				//清空队列
{
	QueuePtr p;
	
	while(Q->front!=Q->rear)
	{

		p=Q->front->next;
		Q->front->next=p->next;
		if(p==Q->rear)							//当删除的是最后一个元素时,令头尾指针指向相同
		Q->rear=Q->front;
		free(p);
	}
	if(Q->front)
		free(Q->front);
}


void DestroyQueue(LinkQueue *Q)			//销毁队列
{
	ClearQueue(Q);
	free(Q);
}


Status EmptyQueue(LinkQueue Q)			//判断队列是否为空
{
	if(Q.front==NULL&&Q.rear==NULL)
		return TRUE;
	return FALSE;
}


int QueueLength(LinkQueue Q)				//返回队列的长度
{
	int count=0;
	QueuePtr p;
	while(Q.front!=Q.rear)
	{
		p=Q.front;
		Q.front=p->next;
		count++;
	}
	return count;
}


Status EnQueue(LinkQueue *Q, ElemType e)	//入队操作
{
	QueuePtr p;
	p=(QueuePtr)malloc(sizeof(QNode));
	if(!p)
		exit(ERROR);
	p->data=e;
	p->next=NULL;
	if(EmptyQueue(*Q))						//让front与rear同时指向第一个结点
		Q->front=Q->rear=p;
	else
	{
		Q->rear->next=p;
		Q->rear=p;
	}
	return OK;
}


Status DeQueue(LinkQueue *Q,ElemType *e)	//出队操作,将队头元素返回给e
{
	QueuePtr p;
	if(EmptyQueue(*Q))
		return ERROR;
	p=Q->front->next;
	*e=p->data;
	Q->front->next=p->next;
	if(p==Q->rear)							//当删除的是最后一个元素时,令头尾指针指向相同
		Q->rear=Q->front;
	free(p);
	return OK;
}


void PrintQueue(LinkQueue Q)				//打印队列
{
	QueuePtr p;
	p=Q.front;
	do
	{   
		printf("%6d",p->data);
		p=p->next;
	}while(p!=Q.rear->next);
	printf("\n");
}
main(void)
{
	LinkQueue *Q;
	ElemType *e;
	Q=(LinkQueue*)malloc(sizeof(LinkQueue));
	
	e=(ElemType*)malloc(sizeof(ElemType));
	InitQueue(Q);
	EnQueue(Q,12);
	EnQueue(Q,13);
	EnQueue(Q,14);
	EnQueue(Q,15);
	EnQueue(Q,16);
	EnQueue(Q,17);
	printf("hello\n");
	PrintQueue(*Q);
	DeQueue(Q,e);
	PrintQueue(*Q);
	printf("%6d\n",*e);
	ClearQueue(Q);
	printf("asid\n");
	PrintQueue(*Q);				//运行时此处为空链表 输出为随机地址
	printf("asid\n");
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值