此处使用C++环境,目的是使用&引用符,用C++环境运行C代码
#define _CRT_SECURE_NO_WARNINGS 1
#define OVERFLOW 1
#define OK -2
#define ERROR 0
#include <stdlib.h>
#include <stdio.h>
typedef int QElemType;
typedef int Status;
typedef struct QNode {
QElemType data;//数值域
struct QNode* next;//指针域
}QNode;
typedef QNode* QueuePtr;
typedef struct {
QueuePtr front;//对头指针
QueuePtr rear;//队尾指针
}LinkQueue;
Status InitQueue(LinkQueue& Q){
//建立空链队列
Q.front = Q.rear = (QueuePtr)malloc(sizeof(QNode));//开辟空间
if (!Q.front)exit(OVERFLOW);//开辟失败
Q.front->next = NULL;//初始化链队
return OK;
}
Status DestroyQueue(LinkQueue& Q){
//销毁队列
while (Q.front)
{
Q.rear = Q.front->next;
free(Q.front);//释放空间
Q.front = Q.rear;
}
Q.rear = NULL;
return OK;
}
Status EnQueue(LinkQueue& Q, QElemType e){
//插入元素e为队尾
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if (!p)exit(OVERFLOW);
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK;
}
Status DeQueue(LinkQueue& Q, QElemType& e){
//删除对头元素
if (Q.front == Q.rear) return ERROR;
QueuePtr p = Q.front->next;
e = p->data;
Q.front->next = p->next;
if (Q.rear == p) Q.rear = Q.front;
free(p);
return OK;
}
void PrintQueue (LinkQueue Q) {
//打印队列
//遍历队列
if (Q.front != Q.rear) {
QueuePtr p = Q.front->next;
while (p != NULL) {
printf("%d\n", p->data);
p = p->next;
}
}
else {
printf("队列为空\n");
}
}
void OperateMenu() {
printf("0.:退出,1.:插入,2.:删除,3.:销毁队列,4.:打印,5.:判断队空,6.:得到队头元素,7.:初始化链队\n");
}
//判断对是否为空
Status QueueEmpty(LinkQueue Q) {
if (Q.front == Q.rear) {
return OK;
}
else {
return OVERFLOW;
}
}
//得到队头元素
void GetHead(LinkQueue Q) {
int a=QueueEmpty(Q);
if (a > 0) {
QueuePtr p = Q.front->next;
printf("队头元素为:%d\n", p->data);
}
else {
printf("队为空,请先插入元素,选择功能1\n");
}
}
int main() {
LinkQueue Q;
Q.front = Q.rear = NULL;
OperateMenu();
printf("请选择功能:");
int e = 0;
while (1) {
scanf("%d", &e);
switch (e){
case 0:return 0;
case 1:
printf("请输入要插入的元素:");
scanf("%d", &e);
if (!Q.rear) {
printf("请先初始化链队,请先选择功能7\n");
OperateMenu();
break;
}
e=EnQueue(Q, e);
if (e == OK) {
printf("插入成功\n");
}
else {
printf("插入失败\n");
}
OperateMenu();
break;
case 2:
if (!Q.rear) {
printf("请先初始化链队,请先选择功能7\n");
OperateMenu();
break;
}
e=DeQueue(Q, e);
if (e == ERROR) {
printf("队为空,无元素可被删除,请先选择功能1插入元素\n");
}
else if (e == OK) {
printf("删除操作成功,请选择接下来的功能\n");
}
OperateMenu();
break;
case 3:
if (!Q.rear) {
printf("请先初始化链队,请先选择功能7\n");
OperateMenu();
break;
}
e=DestroyQueue(Q);
if (e == OK) {
printf("操作成功,链队已销毁\n");
}
else {
printf("操作失败");
}
OperateMenu();
break;
case 4:
if (!Q.rear) {
printf("请先初始化链队,请先选择功能7\n");
OperateMenu();
break;
}
PrintQueue(Q);
OperateMenu();
break;
case 5:
if (!Q.rear) {
printf("请先初始化链队,请先选择功能7\n");
OperateMenu();
break;
}
e=QueueEmpty(Q);
if (e == OVERFLOW) {
printf("队不为空\n");
}
else if (e == OK) {
printf("队为空\n");
}
OperateMenu();
break;
case 6:
if (!Q.rear) {
printf("请先初始化链队,请先选择功能7\n");
OperateMenu();
break;
}
GetHead(Q);
OperateMenu();
break;
case 7:
e=InitQueue(Q);
if (e == OK) {
printf("操作成功\n");
}
OperateMenu();
break;
default:
printf("输入有误,请重新输入:");
OperateMenu();
break;
}
}
}