目录
一、功能函数(func.cpp)
#include "before.h"
#include <iostream>
#include <cstdlib>
using namespace std;
status InitQueue_LinkQueue(LinkQueue &Q)
{
Q.front=Q.rear=(QNode *) malloc(sizeof(QNode));
if(!Q.rear) return ERR; //空间申请失败
Q.front->next = NULL;
return OK; //建立空队列成功
}//初始化链队列
status EnQueue_LinkQueue(LinkQueue &Q,ElemType e)
{
QNode *p = (QNode *) malloc(sizeof(QNode));
if(!p) return ERR; //空间申请失败
p->data = e;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
return OK; //入队成功
}//入链队列
status DeQueue_LinkQueue(LinkQueue &Q,ElemType &e)
{
if(Q.front == Q.rear) return ERR; //队空
if(!Q.front) return OVERFLOW; //队销毁
QNode *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 DestroyQueue_LinkQueue(LinkQueue &Q)
{
QNode *p;
while(Q.front)
{
p = Q.front->next;
free(Q.front);
Q.front = p;
}
Q.rear = Q.front;
}//销毁链队列
status LengthQueue_LinkQueue(LinkQueue Q)
{
int cnt = 0;
while(Q.front->next != NULL)
{
cnt ++;
Q.front = Q.front->next;
}
return cnt;
}//求队列长度
status GetHead_LinkQueue(LinkQueue Q)
{
return Q.front->next->data;
}//取队首
void PrintQueue_LinkQueue(LinkQueue Q)
{
if(!Q.front) cout << "当前链队列已被销毁,无法打印!" << endl;
else if(Q.front == Q.rear) cout << "当前链队列为空,无法打印!" << endl;
else
{
int num = 0;
QNode *point = Q.front->next;
cout << "当前链队列元素为:" << endl;
while(point)
{
cout << point->data << " ";
num ++;
point = point->next;
if(num % 7 == 0) cout << endl;
}
}
}//打印队列
//循环队列
status InitQueue_SqQueue(SqQueue &Q)
{
if(!Q.base) return ERR; //空间分配失败
Q.front = Q.rear = 0;
return OK; //建立成功
}//初始化循环队列
status EnQueue_SqQueue(SqQueue &Q,ElemType e)
{
if((Q.rear+1)%MAXQsize == Q.front) return ERR; //队列满
Q.base[Q.rear] = e;
Q.rear = (Q.rear+1)%MAXQsize;
return OK; //入队成功
}//入队列
status DeQueue_SqQueue(SqQueue &Q,ElemType &e)
{
if(Q.front == Q.rear && Q.front == -1) return OVERFLOW; //队列被销毁
else if(Q.front == Q.rear) return ERR; //队列为空
else
{
e = Q.base[Q.front];
Q.front = (Q.front+1)%MAXQsize;
return OK; //出队成功
}
}//出队列
status LengthQueue_SqQueue(SqQueue Q)
{
return (Q.rear-Q.front+MAXQsize)%MAXQsize;
}//求当前队列长度
status GetHeadQueue_SqQueue(SqQueue Q)
{
return Q.base[Q.front];
}//取队首
void DestroyQueue_SqQueue(SqQueue &Q)
{
Q.front = Q.rear = -1;
}//销毁循环队列
void PrintQueue_SqQueue(SqQueue Q)
{cout << "Q.f " << Q.front << " Q.r" << Q.rear << endl;
if(Q.front == -1 && Q.rear == Q.front) cout << "该循环队列已被销毁!无法打印!" << endl;
else if(Q.front == Q.rear && Q.front == 0) cout << "该顺序队列为空!无法打印!" << endl;
else
{
int cnt = 0;
cout << "当前顺序队列的元素为:" << endl;
while(Q.rear != Q.front)
{
cout << Q.base[Q.front] << " ";
cnt ++;
Q.front = (Q.front+1) % MAXQsize;
if(cnt%7 == 0) cout << endl;
}
}
}//打印循环队列
//菜单打印
void Menu()
{
printf("\t\t\t***********************此为队列的菜单**********************\n");
printf("\t\t\t\t1、链队列 2、循环队列 \n");
printf("\t\t\t\t0、退出操作程序 \n");
printf("\t\t\t*********************************************************\n");
}
void Menu_LinkQueue()
{
printf("\t\t\t**********************此为链队列菜单***********************\n");
printf("\t\t\t\t1、初始化链队列 2、入链队列 \n");
printf("\t\t\t\t3、出链队列 4、求队列长度 \n");
printf("\t\t\t\t5、求队首元素 6、销毁链队列 \n");
printf("\t\t\t\t7、打印链队列 0、退出当前程序 \n");
printf("\t\t\t\tTips:进行完选项1之后才可进行其余操作! \n");
printf("\t\t\t*********************************************************\n");
}
void Menu_SqQueue()
{
printf("\t\t\t********************此为顺序队列菜单**********************\n");
printf("\t\t\t\t1、初始化顺序队列 2、入顺序队列 \n");
printf("\t\t\t\t3、出顺序队列 4、求队列长度 \n");
printf("\t\t\t\t5、求队首元素 6、销毁顺序队列 \n");
printf("\t\t\t\t7、打印顺序队列 0、退出当前程序 \n");
printf("\t\t\t\tTips:进行完选项1之后才可进行其余操作! \n");
printf("\t\t\t********************************************************\n");
}
//
// Created by somewon on 2022/10/18.
//
二、主函数(main.cpp)
#include <iostream>
#include "before.h"
using namespace std;
int main() {
int choice,ch;
do {
Menu();
cout << "请输入你的选择:";
cin >> choice;
if(choice == 1) //链队列
{
do {
Menu_LinkQueue();
cout << "请输入你的选择:";
cin >> ch;
LinkQueue Q;
int fine;
ElemType e;
switch(ch)
{
case 0:
goto END;
case 1:
fine = InitQueue_LinkQueue(Q);
if(fine == OK) cout << "初始化链队列成功!" <<endl;
else cout << "初始化链队列失败!" << endl;
break;
case 2:
cout << "请输入需要入队列的元素:";
cin >> e;
fine = EnQueue_LinkQueue(Q,e);
if(fine == OK)
{
cout << "元素入队成功!" <<endl;
PrintQueue_LinkQueue(Q);
}
else cout << "空间申请失败,元素入队失败!" << endl;
break;
case 3:
fine = DeQueue_LinkQueue(Q,e);
if(fine == OK)
{
cout << "出队成功!被出队元素值为:" << e << endl;
PrintQueue_LinkQueue(Q);
}
else if(fine == ERR)cout << "队列当前为空,出队失败!请再次进行操作!" << endl;
else if(fine == OVERFLOW) cout << "当前队列已被销毁,无法出队!请再次进行操作!" << endl;
break;
case 4:
if(!Q.front) cout << "当前队列已被销毁!" <<endl;
else if(Q.front == Q.rear) cout << "当前队列为空!" << endl;
else cout << "当前链队列的长度为:" << LengthQueue_LinkQueue(Q) << endl;
break;
case 5:
if(!Q.front) cout << "当前链队列已被销毁,无队首元素!" << endl;
else if(Q.front == Q.rear) cout << "当前链队列为空,无队首元素!" << endl;
else cout << "当前链队列的队首元素为:" <<GetHead_LinkQueue(Q) << endl;
break;
case 6:
DestroyQueue_LinkQueue(Q);
cout << "当前链队列销毁成功!" << endl;
break;
case 7:
PrintQueue_LinkQueue(Q);
break;
}
}while(ch);
}
else if(choice == 2) //顺序队列
{
do {
Menu_SqQueue();
cout << "请输入你的选择:";
cin >> ch;
SqQueue Q;
ElemType e;
int fine;
switch(ch)
{
case 0:
goto END;
case 1:
fine = InitQueue_SqQueue(Q);
if(fine == OK) cout << "循环队列初始化成功!" << endl;
else cout << "循环队列初始化失败!" << endl;
break;
case 2:
cout << "请输入需要入队的元素:";
cin >> e;
fine = EnQueue_SqQueue(Q,e);
if(fine == OK)
{
cout << "该元素入队成功!" << endl;
PrintQueue_SqQueue(Q);
}
else cout << "队列空间已满,无法入队列!" << endl;
break;
case 3:
fine = DeQueue_SqQueue(Q,e);cout << "Q.f " << Q.front << " Q.r" << Q.rear << endl;
if(fine == ERR) cout << "当前循环队列为空,无法出队列元素!" << endl;
else if(fine == OVERFLOW) cout << "当前队列已被销毁,无法出队列元素!" <<endl;
else
{
cout << "出队列成功,所出元素为:" << e << endl;
PrintQueue_SqQueue(Q);
}
break;
case 4:
if(Q.front == -1 && Q.front == Q.rear) cout << "当前队列已被销毁!" <<endl;
else if(Q.front == Q.rear && Q.rear == Q.front) cout << "当前队列为空!" << endl;
else cout << "当前循环队列的长度为:" << LengthQueue_SqQueue(Q) << endl;
break;
case 5:cout << "Q.f " << Q.front << endl;
if(Q.front== -1 && Q.rear == Q.front) cout << "当前队列已被销毁,无队首元素!" << endl;
else if(Q.front == Q.rear && Q.front == 0) cout << "当前队列为空,无队首元素!" << endl;
else cout << "当前循环队列的队首元素为:" << GetHeadQueue_SqQueue(Q) << endl;
break;
case 6:
DestroyQueue_SqQueue(Q);
cout << "当前循环队列已被销毁!" << endl;
break;
case 7:
PrintQueue_SqQueue(Q);
break;
default:
cout << "无该操作!" << endl;
fflush(stdin);
}
}while(ch);
}
else if(choice == 0) goto ENDD;
else
{
cout << "无该操作!" << endl;
}
END:
cout << "已退出当前程序!" << endl;
}while(choice);
ENDD:
cout << "整个项目操作结束!欢迎下次修改!" << endl;
return 0;
}
//
//Created by somewon on 2022/10/18.
//
三、头文件(head.h)
#ifndef C___BEFORE_H
#define C___BEFORE_H
#define OK 1
#define ERR 0
#define OVERFLOW (-1)
#define MAXQsize 5
typedef int ElemType;
typedef int status;
//链队列
typedef struct QNode
{
ElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
status InitQueue_LinkQueue(LinkQueue &Q); //初始化链队列
status EnQueue_LinkQueue(LinkQueue &Q,ElemType e); //入链队列
status DeQueue_LinkQueue(LinkQueue &Q,ElemType &e); //出链队列
void DestroyQueue_LinkQueue(LinkQueue &Q); //销毁链队列
status LengthQueue_LinkQueue(LinkQueue Q); //队列长度
status GetHead_LinkQueue(LinkQueue Q); //输出队首元素
void PrintQueue_LinkQueue(LinkQueue Q); //打印链队列
//循环队列
typedef struct
{
ElemType base[MAXQsize];
int front;
int rear;
}SqQueue;
status InitQueue_SqQueue(SqQueue &Q); //初始化循环队列
status EnQueue_SqQueue(SqQueue &Q,ElemType e); //入队列
status DeQueue_SqQueue(SqQueue &Q,ElemType &e); //出队列
status LengthQueue_SqQueue(SqQueue Q); //队列长度
status GetHeadQueue_SqQueue(SqQueue Q); //取队首
void DestroyQueue_SqQueue(SqQueue &Q); //销毁队列
void PrintQueue_SqQueue(SqQueue Q); //打印循环队列
//菜单声明
void Menu(); //主选择菜单
void Menu_LinkQueue(); //链队列菜单
void Menu_SqQueue(); //顺序队列菜单
#endif //C___HEAD_H
//
// Created by somewon on 2022/10/18.
//