概念理解:
队列:逻辑结构
链式队列:使用链式存储方式实现的队列
带头结点的链式队列:
对头指针:front,始终指向头结点
队尾指针:rear,始终指向队尾结点
判队空:Q.front == Q.rear
链表的结点结构体:
//结点
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
队列结构体:
//队列,声明指向结点的头指针和尾指针
//队列别名LinkQueue,是结构体类型 ,而非指向结构体的指针类型
typedef struct {
LNode *front;
LNode *rear;
}LinkQueue;
测试:
#include <stdio.h>
#include <stdlib.h>//使用malloc和free关键字需要引入这个库
//结点
typedef struct LNode{
int data;
struct LNode *next;
}LNode;
//队列,声明指向结点的头指针和尾指针
//队列别名LinkQueue,是结构体类型 ,而非指向结构体的指针类型
typedef struct {
LNode *front;
LNode *rear;
}LinkQueue;
//初始化队列
void InitQueue(LinkQueue &Q) {
Q.front = Q.rear = (LNode*)malloc(sizeof(LNode));
Q.front->next = NULL;
}
//判队空
bool IsEmpty(LinkQueue Q){
if(Q.front == Q.rear){
return true;
}else{
return false;
}
}
//入队
void EnQueue(LinkQueue &Q,int x){
LNode *s = (LNode*)malloc(sizeof(LNode));
s->data = x;
Q.rear->next = s;
Q.rear = s;
s->next = NULL;
}
//出队
bool DeQueue(LinkQueue &Q,int &x){
if(Q.front == Q.rear){
return false;
}
LNode *s = Q.front->next;
x = s->data;
Q.front->next = s->next;
if(Q.rear = s){//防止出队后队空,队尾指针丢失
Q.rear = Q.front;
}
free(s);
return true;
}
//打印队列
void printQueue(LinkQueue &Q){
LNode *s = Q.front->next;
while(s!=NULL){
printf("%d,",s->data);
s = s->next;
}
printf("\n");
}
int main(){
int x;
LinkQueue Q;
InitQueue(Q);
printf("%d\n",IsEmpty(Q));
EnQueue(Q,1);
EnQueue(Q,2);
EnQueue(Q,3);
EnQueue(Q,4);
EnQueue(Q,5);
DeQueue(Q,x);
printQueue(Q);
printf("%d\n",IsEmpty(Q));
return 0;
}