不带头结点的链式队列在操作上往往比较麻烦,因此通常将链式队列设计成一个带头结点的单链表。
注意带头结点的链队列的出队操作。
注意不带头结点的链队列的出队和入队操作。
带头结点
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode{
int data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQueue;
//初始化队列(带头结点)
void InitQueue(LinkQueue &Q){
//初始时, front和rear都指向头结点
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
Q.front->next=NULL;
}
bool IsEmpty(LinkQueue Q){
return Q.front==Q.rear;
}
void EnQueue(LinkQueue &Q,int x){
LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
}
bool DeQueue(LinkQueue &Q,int &x){
if(Q.front==Q.rear){
return false;
}
LinkNode *p=Q.front->next;
x=p->data;
Q.front->next=p->next;
//若原队列中只有一个结点, 删除后变空
if(Q.rear==p){
Q.rear=Q.front;
}
free(p);
return true;
}
int main(){
return 0;
}
不带头结点
#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode{
int data;
struct LinkNode *next;
}LinkNode;
typedef struct{
LinkNode *front,*rear;
}LinkQueue;
//初始化队列(不带头结点)
void InitQueue(LinkQueue &Q){
//初始时, front和rear都指向NULL
Q.front=NULL;
Q.rear=NULL;
}
bool isEmpty(LinkQueue Q){
return Q.front==NULL;
}
void EnQueue(LinkQueue &Q,int x){
LinkNode *s=(LinkNode*)malloc(sizeof(LinkNode));
s->data=x;
s->next=NULL;
//若原队列为空队, 则令Q.front也指向该结点
if(Q.front==NULL){
Q.front=s;
Q.rear=s;
}else{
Q.rear->next=s;
Q.rear=s;
}
}
bool DeQueue(LinkQueue &Q,int &x){
if(Q.front==NULL){
return false;
}
LinkNode *p=Q.front;
x=p->data;
Q.front=p->next;
//若该结点为最后一个结点, 则置Q.front和Q.rear都为NULL
if(Q.rear==p){
Q.front=NULL;
Q.rear=NULL;
}
free(p);
return true;
}
int main(){
return 0;
}