数据结构 第三章-- 链队列

队列:是一种先进先出(FIFO)的线性表。它只允许在表的一端进行插入,而在另一端删除元素。

队尾:允许插入的一端。

队头:允许删除的一端。

       

       和线性表类似,队列也可以有两种存储表示。

       用链表表示的队列简称链队列,一个链队列显然需要两个分别指示队头和队尾的指针(分别称为头指针和尾指针)才能唯一确定。这里,和线性表的单链表一样,为了操作方便起见,我们也给链队列添加一个头结点,并令头指针指向头结点。由此,空的链队列的判定条件为头指针和尾指针均指向头结点。一般情况下,删除队列的头元素时仅需修改头结点的指针,但当队列中的最后一个元素被删后,队列尾指针也丢失了,因此需对队尾指针重新赋值(指向头结点)。

//---------------单链队列-----------------
//LinkQueue.h
#ifndef LINK_QUEUE_H
#define LINK_QUEUE_H

#define OK 1
#define OVERFLOW  -2
#define Status  bool
#define TRUE  1
#define FALSE 0
#define ERROR 0

typedef int SElemType;
typedef struct QNode
{
	SElemType data;
	struct QNode *next;
}QNode, *QNodePtr;

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

Status InitQueue(LinkQueue &Q);
Status DestroyQueue(LinkQueue &Q);
Status QueueEmpty(LinkQueue Q);
int Queuelength(LinkQueue Q);
Status EnQueue(LinkQueue &Q, SElemType e);
Status DeQueue(LinkQueue &Q, SElemType &e);
Status QueueTraverse(LinkQueue Q, void (*visit)(QNodePtr));
#endif

//LinkQueue.cpp
#include "LinkQueue.h"
#include "stdlib.h"
Status InitQueue(LinkQueue &Q)
{
     Q.front = Q.rear = (QNodePtr)malloc(sizeof(QNode));
	 if (!Q.front)  exit(OVERFLOW);
	 Q.front->next = NULL;
	 return OK;
}

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

Status QueueEmpty(LinkQueue Q)
{
	if (Q.front == Q.rear)
		return TRUE;
	else
		return FALSE;
}

int Queuelength(LinkQueue Q)
{
	QNodePtr pNode = Q.front->next;
	int len = 0;
	while (pNode)
	{
		len ++;
		pNode = pNode->next;
	}
	return len;
}

Status EnQueue(LinkQueue &Q, SElemType e)
{
	QNodePtr pNode = (QNodePtr)malloc(sizeof(QNode));
	pNode->data = e;
	if (!pNode)  exit(OVERFLOW);
	pNode->next = Q.rear->next;
	Q.rear->next = pNode;
	Q.rear = pNode;
	return OK;
}

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

Status QueueTraverse(LinkQueue Q, void (*visit)(QNodePtr p))
{
	QNodePtr pNode = Q.front->next;
	while (pNode)
	{
		visit(pNode);
		pNode = pNode->next;
	}
	return OK;
}


你可能感兴趣的:(c/c++,复习,算法/数据结构)