一.链队列的定义:
typedef struct LinkNode{ //链式队列结点定义
ElemType data;
struct LinkNode *next;
}LinkNode;
typedef struct { //链式队列
LinkNode *front,*rear; //队列的队头指针和队尾指针
}LinkQueue;
int main(){
LinkQueue Q;
return o;
}
二.初始化一个队列:
- 带头结点的队列:
void InitQueue(LinkQueue &Q){
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
Q.front->next=NULL;
}
//判断一个队列是否为空
bool EmptyQueue(LinkQueue Q){
return Q.front==Q.rear;
}
- 不带头结点的队列:
void InitQueue(LinkQueue &Q){
Q.front=NULL;
Q.rear=NULL;
}
//判断队列是否为空
bool EmptyQueue(LinkQueue Q){
return Q.front==NULL;
}
三.入队操作:
- 带头结点:
void EnQueue (LinkQueue &Q,ElemType x){
LinkNode *p=(LinkNode*)malloc(sizeof(LinkNode));
p->data=x;
p->next=NULL;
Q.rear->next=p;
Q.rear=p;
}
对应单链表的后插操作。
2. 不带头结点:
void EnQueue(LinkQueue &Q,ElemType x){
LinkNode *p=(LinkNode*)malloc(sizeof(LinkNode));
p->data=x;
p->next=NULL;
if(Q.front ==NULL){
Q.front=p;
Q.rear=p; //修改队头队尾指针
}else
Q.rear->next=p;
Q.rear=p;
}
四.出队操作:
- 带头结点:
bool DeQueue(LinkNode &Q,int &e){
if(Q.front==Q.rear)
return false;
LinkNode *p=Q.front->next;
e=p->data;
Q.front->next=p->next;
if(Q.rear==p)
Q.rear=Q.front;
free(p);
return true;
}
- 不带头结点:
bool DeQueue(LinkNode &Q,int &e){
if(Q.front==NULL)
return false;
LinkNode *p=Q.front;
e=p->data;
Q.front=p->next;
if(Q.rear==p){ //最后一个结点出队
Q.front=NULL;
Q.rear=NULL;
}
free(p);
return true;
}
注意:链式队列一般不用考虑队满。