一、用链式存储实现队列
// 链式队列结点
typedef struct LinkNode
{
int data;
struct linkNode *next;
}LinkNode;
// 链式队列
typedef struct
{
//队列的队头和队尾指针
LinkNode *front,*rear;
}LinkQueue;
二、初始化队列
//初始化队列(带头结点)
void InitQueue(LinkQueue &Q)
{
Q.front=Q.rear=(LinkNode*)malloc(sizeof(LinkNode));
Q.front->next = NULL;
}
//初始化队列(不带头结点)
void InitQueue(LinkQueue &Q)
{
// 初始时 front、rear 都指向NULL
Q.front = NULL;
Q.rear = NULL;
}
三、基本操作
1.入队
带头结点:
//入队(带头结点)
void EnQueue(LinkQueue &Q,int x)
{
LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL;
Q.rear->next = s; //新结点插入到rear之后
Q.rear = s; // 修改表尾指针
}
不带头结点:
//入队 (不带头节点)
void EnQueue(LinkQueue &Q,int x)
{
LinkNode *s = (LinkNode*)malloc(sizeof(LinkNode));
s->data = x;
s->next = NULL;
//空队列中插入第一个元素
if(Q.front == NULL){
Q.front = s;
Q.rear = s; //第一个元素入队时需要特别处理
}else{
Q.rear->next = s;
Q.rear = s;
}
}
2.出队
//出队 (带头结点)
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){ //z最后一个结点出队
Q.rear = Q.front
}
free(p);
return true;
}
//出队(不带头结点)
bool DeQueue(LinkQueue &Q,int &x)
{
if(Q.front==NULL){
return false;
}
LinkNode *p = Q.front;
x = p->data;
Q.front = p->next;
if(Q.rear == p){ //最后一个结点出队
Q.front = NULL;
Q.rear = NULL;
}
free(p);
return true;
}
3.判空
//判断队列是否为空(带头结点)
bool IsEmpty(LinkQueue Q)
{
if(Q.front == Q.rear){
return true;
}else{
return false;
}
}
//判断队列是否为空(不带头结点)
bool IsEmpty(LinkQueue Q)
{
if(Q.front == NULL){
return true
}else{
return false;
}
}