概述
链队的要素:
(1)两个状态
- 队空状态:lqu->rear==NULL或者lqu->front==NULL
- 队满状态:假设内存无限大的情况就不存在队满的情况
(2)两个操作
- 元素进队操作(假设p指向进队元素):lqu->rear->next=p;lqu->rear=p;
- 元素出队操作(假设x存储出队元素):p=lqu->front;lqu->front=p->next;x=p->data;free(p);
链表操作示意图:
代码
#include<stdio.h>
#include<stdlib.h>
#define maxSize 20
/* 链队结点类型定义 */
typedef struct QNode {
int data;// 数据域
struct QNode *next;// 指针域
} QNode;
/* 链队类型定义 */
typedef struct {
QNode *front;// 队头指针
QNode *rear;// 队尾指针
} LiQueue;
/* 初始化链队 */
/* *&lqu指的是链队 */
void initQueue(LiQueue *&lqu) {
lqu=(LiQueue*)malloc(sizeof(LiQueue));// 创建链队
lqu->front=NULL;// 将头指针初始化为NULL
lqu->rear=NULL;// 将尾指针初始化为NULL
}
/* 判断队空 */
int isQueueEmpty(LiQueue *lqu) {
if(lqu->front==NULL||lqu->rear==NULL) { // 只要队头指针和队尾指针任一为NULL就队空
return 1;// 队空返回1
} else {
return 0;// 非空返回0
}
}
/* 入队 */
void enQueue(LiQueue *lqu,int x) {
QNode *p;// 要入队的结点
p=(QNode*)malloc(sizeof(QNode));// 为结点分配空间
p->data=x;// 赋予数据
p->next=NULL;
if(lqu->rear==NULL) { // 若队列为空,则新结点是队首结点,也是队尾结点
lqu->front=p;
lqu->rear=p;
} else { // 若队列非空
lqu->rear->next=p;// 将新结点链接到队尾
lqu->rear=p;// 同时将队尾指针指向新结点
}
}
/* 出队 */
int deQueue(LiQueue *lqu,int &x) {
QNode *p;// 保存要出队的结点
if(lqu->rear==NULL) { // 队空不能出队
return 0;
} else {
p=lqu->front;// 即保存要出队的头结点
}
if(lqu->front==lqu->rear) { // 队列中只有一个结点,出队操作需要特殊处理
lqu->front=lqu->rear=NULL;// 只有一个结点,出队后队列为空
} else {
lqu->front=lqu->front->next;// 将队首指针指向原队首指针的下一个结点
}
x=p->data;// 保存要出队的数据
free(p);// 释放结点资源
return 1;// 出队成功返回1
}
/* 打印队列 */
void printQueue(LiQueue *lqu) {
printf("\n");
while(lqu->front!=NULL) {
int x;
deQueue(lqu,x);
printf("%d\t",x);
}
printf("\n");
}
int main() {
/* 初始化链队 */
LiQueue *lqu;
initQueue(lqu);
/* 入队 */
int nums[]= {1,2,3,4,5};
int n=5;
for(int i=0; i<n; i++) {
enQueue(lqu,nums[i]);
}
// printQueue(lqu);// 打印入队后的队列
/* 出队 */
int x;
int i=deQueue(lqu,x);
printf("出队元素:%d",x);// 打印出队元素
}