链式队列是采用链式存储结构实现的队列。
存储结构
typedef struct Qnode{
int data;
struct Qnode *next;
} *Quene; //每一个结点的结构
typedef struct{
Quene front; //队头指针
Quene rear; //队尾指针
}LinkQuene;
初始化
//初始化
void initQuene(LinkQuene &Q){
Q.front = Q.rear = new Qnode; //队头队尾指针都指向新创建的空结点
Q.front->next = NULL; //将队头指针指向的结点的next域指向空
}
入队
//入队
void push(LinkQuene &Q,int e){
//新建结点 指针p指向新结点
Qnode *p = new Qnode;
//将新结点的数据域置为e
p->data = e;
//将新结点插入到队尾
p->next = NULL;
Q.rear->next = p;
//修改队尾指针
Q.rear = p;
}
出队
//出队
bool pop(LinkQuene &Q){
//判断队列是否为空
if(isnull(Q)){
return false;
}
else{
//临时保存队头指针指向的结点
Qnode *temp = Q.front->next;
//修改头结点指针域
Q.front->next = temp->next;
//判断出队的结点是否为最后一个结点,若是则将队头队尾指针重新赋值
if(Q.rear == temp) Q.rear = Q.front;
//释放临时保存的结点
delete temp;
return true;
}
}
取队头元素
int getHead(LinkQuene &Q){
if(!isnull(Q)){
return Q.front->next->data;
}
}
总结测试
#include <iostream>
using namespace std;
//存储结构
typedef struct Qnode{
int data;
struct Qnode *next;
} *Quene; //每一个结点的结构
typedef struct{
Quene front; //队头指针
Quene rear; //队尾指针
}LinkQuene;
//初始化
void initQuene(LinkQuene &Q){
Q.front = Q.rear = new Qnode; //队头队尾指针都指向新创建的空结点
Q.front->next = NULL; //将队头指针指向的结点的next域指向空
}
//入队
void push(LinkQuene &Q,int e){
//新建结点 指针p指向新结点
Qnode *p = new Qnode;
//将新结点的数据域置为e
p->data = e;
//将新结点插入到队尾
p->next = NULL;
Q.rear->next = p;
//修改队尾指针
Q.rear = p;
}
//判空
bool isnull(LinkQuene &Q){
if(Q.rear == Q.front) return true;
return false;
}
//出队
bool pop(LinkQuene &Q){
//判断队列是否为空
if(isnull(Q)){
return false;
}
else{
//临时保存队头指针指向的结点
Qnode *temp = Q.front->next;
//修改头结点指针域
Q.front->next = temp->next;
//判断出队的结点是否为最后一个结点,若是则将队头队尾指针重新赋值
if(Q.rear == temp) Q.rear = Q.front;
//释放临时保存的结点
delete temp;
return true;
}
}
//取队头元素
int getHead(LinkQuene &Q){
if(!isnull(Q)){
return Q.front->next->data;
}
}
int main()
{
LinkQuene Q;
initQuene(Q);
push(Q,1);
push(Q,2);
push(Q,3);
cout << getHead(Q) << endl;
pop(Q);
cout << getHead(Q) << endl;
pop(Q);
cout << getHead(Q) << endl;
return 0;
}
运行结果