①基本定义
采用链式存储结构的队列称为链队,除了他本身的数据结点类型外,链队还需要一种链队结点类型(其实就是包含了两个指针的结构体,因为队列的操作分别在队头和队尾,所以一个指针指向队首结点,一个指针指向队尾结点)。和链栈一样,链队也不存在队满上溢出的情况。
②存储方式与结构
队空的条件: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;
}
---代码和部分内容参考自《数据结构教程》