本文为CSDN博主coder_gxd原创
转载请注明:https://blog.csdn.net/coder_gxd/article/details/79852909
本文介绍数据结构中链队的常用算法(C/C++版),欢迎各位同学讨论指正。
#include <stdlib.h>//函数malloc(),free()所在头文件
//本文链队为不含头结点的链队
//定义链队结点
typedef struct QNode {//链队结点定义延用单链表定义
int data;//数据域
struct LNode *next;//指针域
}QNode;
//定义链队类型
typedef struct {//链队一般认为不会队满,除非内存溢出;
QNode *front;//队首指针
QNode *rear;//队尾指针
}LiQueue;
//初始化链队,时间复杂度为O(1);
//创建链队,并且队头队尾指针均指向NULL;
void initQueue (LiQueue *&lqu){
lqu=(LiQueue *)malloc(sizeof(Liqueue));
lqu->front=NULL;
lqu->rear=NULL;
}
//判断队空,时间复杂度为O(1);
//队空返回1,否则返回2;
int isQueueEmpty(LiQueue *lqu){
if(lqu->rear==NULL||lqu->front=NULL){//队首或队尾指向NULL
return 1;
}
else{
return 0;
}
}
//入队算法,时间复杂度为O(1);
//创建新结点p,若原链队空,则队头和队尾均指向p;若原链表不为空,将p结点链在队尾后,队尾指针指向p;
void EnQueue(LiQueue *lqu,int x){
QNode *p=(LNode *)malloc(sizeof(QNode));
p->data=x;
p->next=NULL;//这三句句创建了链队结点p,并将数据 x 置入结点中;
if(lqu->rear==NULL||lqu->front==NULL){//若链队为空,则队头队尾均指向p;
lqu->front=p;
lqu->rear=p;
}
else{//原链表不为空,将p结点链在队尾后,队尾指针指向p;
lqu->rear->next=p;
lqu->rear=p;
}
}
//出队算法,时间复杂度为O(1);
//将链队lqu的队首元素出队,若队空失败,则返回0;若成功,则返回1;
int DeQueue(LiQueue *lqu,int &x){
QNode *p;//用于存储出队的结点;
if(lqu->rear==NULL){//队空不出,返回0;
return 0;
}
else{
p=lqu->front;//p指向队首结点
}
if(lqu->front==lqu->rear){//特殊情况,队内仅有一个元素
lqu->rear=NULL;//队尾指向0;
lqu->front=NULL;//队首指向0;
}
else{
lqu->front=lqu->front->next;//队首指针前进一位;
}
x=p->data;//将出队结点数据元素赋值给 x ;
free(p);//释放 p 结点;
return 1;
}