数据结构严蔚敏 队列基本操作 C语言实现

【数据结构严蔚敏】 第三章 队列基本操作C语言

队列基本操作与栈类似,区别是删除元素时根据先进先出原则(FIFO),下面给出链队列的基本操作。

代码部分

1.基本结构定义

typedef int QElemType;	//元素类型
typedef int Status;		
typedef struct QNode {
	QElemType data;
	struct QNode *next;
}QNode,*QueuePtr;

typedef	struct {
	QueuePtr front;	//对头指针
	QueuePtr rear;	//队尾指针
}LinkQueue;

2.基本操作函数声明 LinkQueue.h

//构造一个空队列
Status InitQueue(LinkQueue &Q);

//销毁队列Q,Q不再存在
Status DetroyQueue(LinkQueue &Q);

//将Q清为空队列
Status ClearQueue(LinkQueue &Q);

//若Q为空队列,则返回TRUE,否则返回FLASE
Status QueueEmpty(LinkQueue Q);

//返回Q的元素个数
int QueueLenth(LinkQueue Q);

//若队列不空,则用e返回Q的队头元素,并返回OK,否则返回ERROR
Status GetHead(LinkQueue Q, QElemType &e);

//插入元素e为Q的新的队尾元素
Status EnQueue(LinkQueue &Q, QElemType e);

//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK
Status DeQueue(LinkQueue &Q, QElemType &e);

//对队列所有元素依次进行visit()操作
Status QueueTraverse(LinkQueue Q, Status(*visit)(QueuePtr));

3.基本操作函数定义 LinkQueue.c

#include "LinkQueue.h"

Status InitQueue(LinkQueue & Q)
{
	//构造一个空队列Q
	Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));
	if (!Q.front)exit(OVERFLOW);
	Q.front->next = NULL;
	return OK;
}

Status DetroyQueue(LinkQueue & Q)
{
	//销毁一个队列
	while (Q.front) {
		Q.rear = Q.front->next;
		free(Q.front);
		Q.front = Q.rear;
	}
	return OK;
}

Status ClearQueue(LinkQueue & Q)
{	//清除一个队列
	while (Q.front->next) {
		Q.rear = Q.front->next;
		free(Q.front);
		Q.front = Q.rear;
	}
	Q.front->next = NULL;
	return OK;
}

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

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

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

Status EnQueue(LinkQueue & Q, QElemType e)
{	//插入元素e为Q的新的队尾元素
	QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
	if (!p)return ERROR;
	p->next = NULL;
	p->data = e;
	Q.rear->next = p;
	Q.rear = p;
	return OK;
}

Status DeQueue(LinkQueue & Q, QElemType & e)
{//若队列不空,则删除Q的队头元素,用e返回其值,并返回OK
	if (Q.front == Q.rear)return ERROR;
	QueuePtr p = (QueuePtr)malloc(sizeof(QNode));   //此处为何要给p申请空间?
	p = Q.front->next;								//Q.front->next已经申请过内存空间
	e = p->data;									//p = Q.front->next之后
	Q.front->next = p->next;						//free(p)free的是哪一块?
	if (Q.rear == p)Q.rear = Q.front;
	free(p);
	return OK;
}

Status QueueTraverse(LinkQueue Q, Status(*visit)(QueuePtr))
{
	QueuePtr p;
	p = Q.front;
	while (p->next)
	{
		p = p->next;
		if (!(visit(p)))return ERROR;
	}
	return OK;
}

4.测试

#include"LinkQueue.h"
int visit(QueuePtr p) {
	//visit函数用来输出队列
	cout << p->data<<" ";
	return OK;
}
int main() {
	LinkQueue Q;
	InitQueue(Q);
	cout << "空队列初始化成功" << endl;
	cout << "在队列中依次插入五个元素" << endl;
	QElemType e;
	for (int i = 0; i < 5; i++)
	{
		cin >> e;
		EnQueue(Q, e);
	}
	cout << "输出整个队列" << endl;
	QueueTraverse(Q,visit);
	DeQueue(Q, e);
	cout << endl;
	cout << "删除队头元素,输出整个队列" << endl;
	QueueTraverse(Q, visit);
	cout << endl<<"清空队列" << endl;
	ClearQueue(Q);
	cout << "输出整个队列" << endl;
	QueueTraverse(Q, visit);
	cout << endl << "销毁队列,结束" << endl;
	DetroyQueue(Q);
	system("pause");
	return 0;
}

结果:
数据结构严蔚敏 队列基本操作 C语言实现_第1张图片

你可能感兴趣的:(数据结构严蔚敏)