1.链式队列
链式队列是一种同时带有队头指针和队尾指针的单链表,头指针指向队头结点,尾指针指向队尾结点。
如图:
2.队列的存储结构类型可以描述为:
typedef struct Node{
int data;
struct Node* next;
}LinkNode;
typedef struct Queue{
LinkNode* rear; //头指针
LinkNode* front; //尾指针
int count; //用于记录队列的元素个数
}LinkQueue;
3.代码实现
以下为带头结点的链式队列实现:
如果要实现不带头结点的链式队列,注意入队第一个元素特殊处理即可
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int data;
struct Node* next;
}LinkNode;
typedef struct Queue{
LinkNode* rear;
LinkNode* front;
int count; //用于记录队列的元素个数
}LinkQueue;
//带头结点初始化
void initLinkQueue(LinkQueue &Q) {
Q.rear = Q.front = (LinkNode*)malloc(sizeof(LinkNode));
Q.front->next = NULL;
Q.count = 0;
}
bool EnLinkQueue(LinkQueue &Q,int e){
//因为链式队列不存在队满的情况,所以不需要判断是否队列满
LinkNode* p = (LinkNode*)malloc(sizeof(LinkNode));
if (!p) { //如果p为空开辟结点失败
return false;
}
p->data = e;
p->next = NULL;
Q.rear->next = p; //让rear指针指向的元素的next指向新插入的结点p
Q.rear = p; //调整rear指针位置
Q.count++;
return true;
}
//链式队列出队时,只需要断链,不需要调整front指针的位置
bool DelinkQueue(LinkQueue& Q, int &x) {
if (Q.rear == Q.front) {
return false;
}
LinkNode* p = Q.front->next; //用指针p来记录要删除的结点
x = p->data;
Q.front->next = p->next;
if (Q.rear==p) { //如果rear指针所指向的元素为最后一个元素,调整rear指针的位置 !p->next
Q.rear = Q.front;
}
free(p);
Q.count--;
p = NULL; //虽然free()了p,但是p仍然会记录此时的地址
return true;
}
bool isEmpty(LinkQueue &Q) {
if (Q.rear == Q.front) {
printf("队列为空");
return true;
}
return false;
}
//打印元素
void printLinkQueueList(LinkQueue & Q) {
for (int i = 0; i < Q.count; i++) {
Q.front = Q.front->next;
printf(" %d \n", Q.front->data);
}
}
int getSize(LinkQueue& Q) {
return Q.count;
}
void menu() {
printf("==========请输入你的操作===========\n");
printf("==========1.初始化队列\n");
printf("==========2.入队\n");
printf("==========3.出队\n");
printf("==========4.获取队列大小\n");
printf("==========5.查看队列元素\n");
printf("==========6.退出\n");
printf("\n");
}
int main() {
LinkQueue Q;
int enEle = 0;
int deEle = 0;
int Qsize = 0;
int ope=0;
bool loop = true;
while (loop) {
menu();
printf("请输入你的操作:");
scanf("%d", &ope);
switch (ope)
{
case 1:
initLinkQueue(Q);
printf("初始化队列成功!\n");
break;
case 2:
printf("输入入队元素:");
scanf("%d", &enEle);
EnLinkQueue(Q, enEle);
printf("入队成功!\n");
break;
case 3:
printf("输入出队元素:");
scanf("%d", &deEle);
DelinkQueue(Q, deEle);
printf("出队元素为:%d\n", deEle);
break;
case 4:
Qsize = getSize(Q);
printf("%d\n", Qsize);
break;
case 5:
printf("队列的元素为:\n");
printLinkQueueList(Q);
break;
case 6:
loop = false;
printf("退出成功!");
break;
default:
printf("输入不合理,请重新输入!");
break;
}
}
}
4.测试
初始化队列后,连续加入11,22,33
查看队列元素个数为:3
查看队列元素为:11,22,33