0.摘要
本文首先以思维导图的形式介绍链式队列的基本知识,其次给出代码中需要额外注意的地方,最后给出带头结点的队列代码实现方式顺序队列(循环队列)实现,请参考我的另一篇博客: 队列——顺序存储结构实现( 循环队列 - 不同指针指向).
1.基本知识
2.代码注意点队列结点定义、链式队列定义(结构体定义),链式队列中 front 和 rear 的引用,具体详情见代码!
3.链式队列代码实现
带头结点
#include<bits/stdc++.h>
using namespace std;
//为保证空队列和非空队列操作一致,采用带头结点
//定义——链式队列结点
typedef struct LinkNode{
int data;
struct LinkNode *next;
}LinkNode;
//定义——链式队列
typedef struct{
LinkNode *front,*rear;
}LinkQueue;
//0.初始化
void InitQueue(LinkQueue &Q){
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode)); // 创建头结点
s->next=NULL;
Q.front=s;
Q.rear=s;
}
//1.入队
bool EnQueue(LinkQueue &Q,int x){
//无需判断队满
LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
s->data=x;
//结点后插
s->next=Q.rear->next;
Q.front->next=s;
Q.rear=s;
return true;
}
//2.出队
bool DeQueue(LinkQueue &Q,int &x){
if(Q.front==Q.rear){ // 判断队列是否为空
return false;
}
LinkNode *p=Q.front->next; // 获取所要出队的结点
x=p->data;
if(p->next==NULL){ // 判断是否为最后一个元素
Q.rear=Q.front;
}
Q.front->next=p->next;
free(p);
return true;
}
//3.获取队头元素
bool GetHead(LinkQueue &Q,int &x){
if(Q.front==Q.rear){ // 判断队空
return false;
}
LinkNode *p=Q.front->next;
x=p->data;
return true;
}
//主程序
int main(){
LinkQueue Q;
InitQueue(Q);
int x;
//1.入队 获取队头
if(EnQueue(Q,8)){
if(GetHead(Q,x)){
cout<<"队头元素:"<<x<<endl;
}else{
cout<<"获取队头错误!!!"<<endl;
}
}else{
cout<<"入队错误!!"<<endl;
}
// EnQueue(Q,9);
// EnQueue(Q,10);
//2.出队
if(DeQueue(Q,x)){
cout<<"出队元素:"<<x<<endl;
}
EnQueue(Q,9);
if(GetHead(Q,x)){
cout<<"队头元素:"<<x<<endl;
}
return 0;
}