数据结构模板之八:链队

①基本定义

采用链式存储结构的队列称为链队,除了他本身的数据结点类型外,链队还需要一种链队结点类型(其实就是包含了两个指针的结构体,因为队列的操作分别在队头和队尾,所以一个指针指向队首结点,一个指针指向队尾结点)。和链栈一样,链队也不存在队满上溢出的情况。

②存储方式与结构

队空的条件:q->rear == NULL 或 q->frnot == NULL。

③实现

#include <iostream>
#include <cstdlib>
using namespace std;
typedef int ElemType;

typedef struct qnode
{
	ElemType data;
	struct qnode *next;
}DataNode;                 //链队数据结点类型

typedef struct
{
	DataNode *front;       //指向队首结点
	DataNode *rear;        //指向队尾结点
}LinkQuNode;               //链队结点的类型

/*****初始化队列*****/
void InitQueue(LinkQuNode * &q)
{
	q=(LinkQuNode*)malloc(sizeof(LinkQuNode));
	q->front=q->rear=NULL;
}

/*****销毁队列*****/
void DestroyQueue(LinkQuNode * &q)
{
	DataNode *pre=q->front,*p;          //pre指向队首结点
	if(pre!=NULL)
	{
		p=pre->next;                    //p指向结点pre的后继结点
		while(p!=NULL)
		{
			free(pre);
			pre=p;
			p=p->next;                  //释放结点后,pre,p同步后移
		}
		free(pre);                      //释放最后一个数据结点
	}
	free(q);                            //释放链队结点
}

/*****判断队列是否为空*****/
bool QueueEmpty(LinkQuNode *q)
{
	return (q->rear==NULL);
}

/*****进队列*****/
void enQueue(LinkQuNode * &q,ElemType e)
{
	DataNode*p;
	p=(DataNode *)malloc(sizeof(DataNode));      //创建新结点
	p->data=e;
	p->next=NULL;
	if(q->rear==NULL)                          //若链队为空,则新结点既是队首结点又是队尾结点
		q->front=q->rear=p;
	else
	{
		q->rear->next=p;                       //将结点p链到队尾,并将rear指向它
		q->rear=p;
	}
}

/*****出队列*****/
bool deQueue(LinkQuNode * &q,ElemType &e)
{
	DataNode *t;
	if(q->rear==NULL)
		return false;
	t=q->front;           //t指向首结点
	if(q->front==q->rear) //原来队列中只有一个数据结点时
		q->front=q->rear=NULL;
	else
		q->front=q->front->next;
	e=t->data;
	free(t);
	return true;
}

int main()
{
	return 0;
}
---代码和部分内容参考自《数据结构教程》

猜你喜欢

转载自blog.csdn.net/gsdxiaohei/article/details/80812290