编写C程序,实现链队列的下列功能:
1、 设计一个虚拟界面,让用户选择操作(根据提示输入数据)
2、 采用模块化编程思想,编写main函数和若干子函数(实现功能)
3、 队列的基本功能有:创建空队列、入队、出队、取队头元素等。
#include<stdio.h>
#include<stdlib.h>
#define MaxSize 6
#define false 0
#define true 1
typedef int datatype;
typedef struct Qnode
{
datatype data; //数据域
struct Qnode* next; //指针域
}Qnode; //结点
typedef struct
{
Qnode* front; //队头指针
Qnode* rear; //队尾指针
int num;
}LinkQueue; //链队列
void printStar() //连续输入几十个*,用来设计虚拟界面的边框
{
int i;
for (i = 0; i < 70; i++)
printf("*");
printf("\n");
}
void menu()
{
printStar();
printf("\t\t\t欢迎进入链队列操作界面!\n");
printf("请从键盘输入数字,完成对应的操作(1到5为有效操作,输入其他退出程序)\n");
printf("\t 1.初始化链队列\n");
printf("\t 2.入队\n");
printf("\t 3.出队\n");
printf("\t 4.取队头元素\n");
printf("\t 5.输出该链队列\n");
printStar();
}
LinkQueue* InitQueue() //初始化链队列
{
LinkQueue* q;
Qnode* p;
q = (LinkQueue*)malloc(sizeof(LinkQueue));//申请头结点的内存空间
p = (Qnode*)malloc(sizeof(Qnode));
q->front = q->rear = p; //对头和队尾指针指向p结点
q->front->next = NULL;
q->num = 0;
printf("链队列初始化成功!\n");
return q;
}
void EnQueue(LinkQueue* Q, datatype x) //入队
{
Qnode* p;
p = (Qnode*)malloc(sizeof(Qnode));
if (Q->num == MaxSize - 1) {
printf("队列已满,无法进行入队操作!\n");
}
p->data = x;
Q->rear->next = p;
p->next = NULL;
Q->rear = p;
Q->num++;
printf("入队完毕\n");
}
void DeQueue(LinkQueue* Q) //出队
{
Qnode* p;
datatype x;
if (Q->front == Q->rear)
printf("队列为空队列,无法进行出队操作!\n");
else
{
p = Q->front->next;
x = p->data;
Q->front->next = p->next;
if (Q->rear == p) {
Q->rear = Q->front;
}
Q->num--;
}
}
int GetHead(LinkQueue* Q) //取队头元素
{
Qnode* p = Q->front->next;
if (Q->front == Q->rear) //空队列
printf("队列为空队列!\n");
else
{
return p->data;
}
}
void display(LinkQueue* Q) //输出该链队列
{
if (Q->front == Q->rear) //空队列
printf("队列为空队列!\n");
else
{
Qnode* k = Q->front->next;
while (k)
{
printf("%d ", k->data);
k = k->next;
}
printf("NULL");
printf("\n");
}
}
void main()
{
int select, x = 0, flag = 1;
LinkQueue* p = NULL;
menu();
while (flag == 1) {
printf("您选择的操作是:");
fflush(stdin);
scanf_s("%d", &select);
switch (select) { //根据用户的输入,调用前面写的子函数,完成链队列的5个功能
case 1: p = InitQueue(); //初始化
printf("\n");
break;
case 2:printf("请输入要入队的数据:");
scanf_s("%d", &x);
EnQueue(p, x); //入队
printf("\n");
break;
case 3: DeQueue(p); //出队
printf("出队\n", x);
break;
case 4:x = GetHead(p); //取队头元素
printf("头元素: %d\n", x);
break;
case 5:display(p); //输出该链队列
printf("\n");
break;
default:printf("您选择退出程序,欢迎下次光临!\n");
flag = 0;
}
}
printf("\n");
system("pause");
}