先上图:
说明在注释里面,一切从简,理解为主!
另附灵魂画图一张:
Ps:看不懂 可以自己根据代码自己画
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
typedef struct Node {//节点结构体
int data;
struct Node *next;
}QNode,*QNodePtr;
typedef struct LinkQueue {//头尾指针结构体
QNodePtr front;
QNodePtr rear;
}LinkQueue,*LinkQueuePtr;
void InitQueue(LinkQueuePtr q) {
QNodePtr p = (QNodePtr)malloc(sizeof(QNode));
if (p == NULL) {
printf("初始化失败!\n");
return;
}
p->next = NULL;
q->front = q->rear = p;
printf("初始化成功!\n");
}
void EnQueue(LinkQueuePtr q) {
int n;
puts("请输入要插入的元素的个数:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
QNodePtr p = (QNodePtr)malloc(sizeof(QNode));//开辟新节点
int x;
printf("请输入元素:");
scanf("%d", &x);
p->data = x;
p->next = NULL;
q->rear->next = p;//使尾指针指向新节点
q->rear = p;//移动尾指针
}
}
void DeQueue(LinkQueuePtr q) {
if (q->front == q->rear) {
printf("队列为空\n");
return;
}
QNodePtr head = q->front;
QNodePtr p = head->next;//指向第一个节点
int x;
x = p->data;//取出数据
head->next = p->next;//跳过中间节点//画图可知
if (p->next == NULL) {//表明链队只有一个节点
q->rear = q->front;//如果链队只有一个节点的话,需要调整尾节点的指针域,否则会产生错误
}
free(p);//释放这个节点的内存
printf("出队元素为:%d\n", x);
}
void EmptyQueue(LinkQueuePtr q) {
if (q->front == q->rear) {
printf("队列为空!\n");
return;
}
else {
printf("队列不为空!\n");
return;
}
}
void GetFront(LinkQueuePtr q) {
if (q->front == q->rear) {
printf("队列为空\n");
return;
}
int x;
QNodePtr head = q->front;
x = head->next->data;
printf("队头元素为:%d\n", x);
}
void Print(LinkQueuePtr q) {
QNodePtr head = q->front->next;
while (head != NULL) {
printf("%d\t", head->data);
head = head->next;
}
printf("\n");
}
void Menu() {
printf("\t\t********************\n");
printf("\t\t1.初始化队列\n");
printf("\t\t2.入队\n");
printf("\t\t3.出队\n");
printf("\t\t4.判断队列是否为空\n");
printf("\t\t5.取队头元素\n");
printf("\t\t6.显示队列元素\n");
printf("\t\t7.退出\n");
printf("\t\t********************\n");
}
int main() {
system("color 9F");
LinkQueue q;
Menu();
int n;
int x;
while (1) {
printf("请输入数字选择操作:\n");
scanf("%d", &n);
switch (n) {
case 1:
InitQueue(&q);
break;
case 2:
EnQueue(&q);
break;
case 3:
DeQueue(&q);
break;
case 4:
EmptyQueue(&q);
break;
case 5:
GetFront(&q);
break;
case 6:
Print(&q);
break;
case 7:
return 0;
}
}
}