您的位置:首页 > 其它

链式队列操作,初始化,入队,出队

2012-10-02 14:18 609 查看
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>

#define OK        1
#define OVERFLOW -1
#define TRUE      1
#define FALSE     0
#define ERROR     0

typedef int QElemType;
typedef int Status;

typedef struct QNode
{
	QElemType data;
	QNode *next;
}*QueuePtr;

struct LinkQueue
{
	QueuePtr front, rear;
};

Status InitQueue(LinkQueue &Q)
{
	if (!(Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode))))
		exit(OVERFLOW);
	Q.front -> next = NULL;
	return OK;
};

Status DestoryQueue(LinkQueue &Q)
{
	while(Q.front)
	{
		Q.rear = Q.front->next;
		free(Q.front);
		Q.front = NULL;
		Q.front = Q.rear;
	}
	return OK;
}

Status ClearQueue(LinkQueue &Q)
{
	QueuePtr q,p;

	Q.rear = Q.front;
	p = Q.front->next;
	Q.front->next = NULL;
	
	while(p)
	{
		q = p->next;
		free(p);
		p = q;
	}
	return OK;
}

Status QueueEmpty(LinkQueue Q)
{
	if (Q.front->next == NULL)
		return TRUE;
	else
		return FALSE;
}

Status QueueLength(LinkQueue Q)
{
	int i = 0;
	QueuePtr p;
	p = Q.front->next;
	while(p)
	{
		++i;
		p = p->next;
	}
	return i;
}

Status GetHead(LinkQueue Q,QElemType &e)
{
	QueuePtr p;
	if(Q.front == Q.rear)
		return ERROR;
	p = Q.front->next;
	e = p->data;
	return OK;
}

Status EnQueue(LinkQueue &Q,QElemType e)
{
	QueuePtr p;
	p = (QueuePtr)malloc(sizeof(QNode));
	if(!p) return OVERFLOW;
	p->data = e;	
	Q.rear->next = p;
	Q.rear = p;
	p->next = NULL;
	return OK;
}

Status DeQueue(LinkQueue &Q,QElemType &e)
{
	QueuePtr p;
	
	if(Q.front == Q.rear)
		return ERROR;
	p = Q.front->next;
	e = p->data;
	Q.front->next = p->next;	
	free(p);
	return OK;
}

Status QueueTraverse(LinkQueue Q,void(*visit)(QElemType))
{
	QueuePtr q;
	q = Q.front->next;
	while(q)
	{
		visit(q->data);
		q = q->next;
	}
	printf("\n");
	return OK;
}

void visit(QElemType e)
{
	printf("%d ",e);
}

int main()
{
	int i;

	QElemType e;
	LinkQueue q;
	i = InitQueue(q);
	if(i)
		printf("Create empty queue successfully!\n");
	printf("Is it empty? %d(1:Yes 0:NO)\n",QueueEmpty(q));
	printf("The length of queue is %d\n",QueueLength(q));
	EnQueue(q,-5);
	EnQueue(q,5);
	EnQueue(q,10);
	printf("After insert three element(-5,5,10),the length of queue is %d.\n",QueueLength(q));
	printf("Is it empty? %d.(1:YES 0:NO)\n",QueueEmpty(q));
	printf("The element of queue are\n");
	QueueTraverse(q,visit);
	i = GetHead(q,e);
	if(i == OK)
		printf("the head element is %d\n",e);
	ClearQueue(q);
	printf("After clear queue,q.front=%#p q.rear=%#p q.front->next=%u\n",q.front,q.rear,q.front->next);
	DestoryQueue(q);
	printf("After destory queue,q.front=%#p q.rear=%#p\n",q.front,q.rear);
	return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐