队列是一端进一端出的限制性数据结构,本代码注重于健壮性,对于程序安全的处理稳定,同样队列也可以用一种顺序队列表示或用一种链队列表示,本代码使用的是链队列,就要 注意每个元素的后继,一下是队列的实现以及其一些基本操作,另外如需对代码详细的解释请发邮件给我,我有详细的实验报告(如未及时回复请谅解!)邮箱见个人资料:
#include <iostream>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define ERROR -1
using namespace std;
typedef int QElemType;
typedef int Statue;
typedef struct QNode{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
void title();
Statue InitQueue(LinkQueue &Q);//初始化
Statue DestroyQueue(LinkQueue &Q);//销毁
Statue ClearQueue(LinkQueue &Q);//清空
Statue QueueEmpty(LinkQueue Q);//队空
Statue QueueLength(LinkQueue Q);//队长
Statue GetHead(LinkQueue Q);//获取队头元素
Statue CreatQueue(LinkQueue &Q,int len);//输入队列元素
Statue EnQueue(LinkQueue &Q);//插入新的队尾元素
Statue DeQueue(LinkQueue &Q);//删除
Statue QueueTraverse(LinkQueue Q);//遍历
int main()
{
title();
int opt = 0;
cout << "请输入操作选项:" << endl;
cin>>opt;
LinkQueue Q;
Q.front = NULL;
while(opt!=0){
int ads = 0;
switch(opt)
{
case 1:
ads = InitQueue(Q);
break;
case 2:
ads = DestroyQueue(Q);
break;
case 3:
ads = ClearQueue(Q);
break;
case 4:
ads = QueueEmpty(Q);
break;
case 5:
ads = QueueLength(Q);
break;
case 6:
ads = GetHead(Q);
cout<<"队列的队头元素"<<ads<<endl;
break;
case 7:
ads = EnQueue(Q);
break;
case 8:
ads = DeQueue(Q);
break;
case 9:
{
if(Q.front==NULL){
cout<<"队列不存在!"<<endl;
break;
}
int len = 0;
cout<<"请输入所要插入的元素个数:"<<endl;
cin>>len;
ads = CreatQueue(Q,len);
break;
}
case 10:
ads = QueueTraverse(Q);
break;
default:
cout<<"输入有误,请重新输入:"<<endl;
}
cout << "请输入操作选项:" << endl;
cin>>opt;
}
return 0;
}
void title(){
cout<<"**************************************************"<<endl;
cout<<"**************************************************"<<endl;
cout<<"******* 1.初始化队列 ******"<<endl;
cout<<"******* 2.销毁队列 ******"<<endl;
cout<<"******* 3.清空队列 ******"<<endl;
cout<<"******* 4.判断队列是否为空 ******"<<endl;
cout<<"******* 5.返回队列中的元素个数 ******"<<endl;
cout<<"******* 6.返回队列的队头元素 ******"<<endl;
cout<<"******* 7.插入新的队尾元素 ******"<<endl;
cout<<"******* 8.删除队头元素 ******"<<endl;
cout<<"******* 9.输入队列元素 ******"<<endl;
cout<<"******* 10.输出队列元素 ******"<<endl;
cout<<"******* 0.退出 ******"<<endl;
cout<<"**************************************************"<<endl;
cout<<"**************************************************"<<endl;
}
Statue InitQueue(LinkQueue &Q){
if(Q.front!=NULL){
cout<<"队列已存在!"<<endl;
return FALSE;
}
Q.front = Q.rear = (QNode*)malloc(sizeof(QNode));
if(!Q.front){
cout<<"申请内存空间失败!"<<endl;
exit(ERROR);
}
Q.front->next=NULL;
cout<<"初始化成功!"<<endl;
return TRUE;
}
Statue DestroyQueue(LinkQueue &Q){
if(Q.front==NULL){
cout<<"队列不存在!"<<endl;
return FALSE;
}
while(Q.front!=NULL){
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
cout<<"销毁成功!"<<endl;
return TRUE;
}
Statue ClearQueue(LinkQueue &Q){
if(Q.front==NULL){
cout<<"队列不存在!"<<endl;
return FALSE;
}
while(Q.front->next!=NULL){
Q.rear = Q.front->next;
free(Q.front);
Q.front = Q.rear;
}
cout<<"清空队列成功!"<<endl;
return TRUE;
}
Statue QueueEmpty(LinkQueue Q){
if(Q.front==NULL){
cout<<"队列不存在!"<<endl;
return FALSE;
}
if(Q.front->next!=NULL){
cout<<"队列中有元素!"<<endl;
}
else{
cout<<"队列为空!"<<endl;
}
return TRUE;
}
Statue QueueLength(LinkQueue Q){
if(Q.front==NULL){
cout<<"队列不存在!"<<endl;
return FALSE;
}
if(Q.front->next==NULL){
cout<<"这是一个空队列!"<<endl;
return FALSE;
}
int n = 0;
while(Q.front->next!=NULL){
Q.front = Q.front->next;
n++;
}
cout<<"这个队列共有"<<n<<"个元素!"<<endl;
return TRUE;
}
Statue GetHead(LinkQueue Q){
if(Q.front==NULL){
cout<<"队列不存在!"<<endl;
return FALSE;
}
if(Q.front->next==NULL){
cout<<"这是一个空队列!"<<endl;
return FALSE;
}
int e = 0;
e = Q.front->next->data;
return e;
}
Statue EnQueue(LinkQueue &Q){
if(Q.front==NULL){
cout<<"队列不存在!"<<endl;
return FALSE;
}
QueuePtr p;
p = (QNode*)malloc(sizeof(QNode));
if(!p){
cout<<"申请内存空间失败!"<<endl;
exit(ERROR);
}
p->next = NULL;
cout<<"请输入新增元素的值:"<<endl;
cin>>p->data;
Q.rear->next = p;
Q.rear = p ;
cout<<"插入成功!"<<endl;
return TRUE;
}
Statue DeQueue(LinkQueue &Q){
if(Q.front==NULL){
cout<<"队列不存在!"<<endl;
return FALSE;
}
if(Q.front->next==NULL){
cout<<"这是一个空队列!"<<endl;
return FALSE;
}
int num = 0;
QueuePtr p;
p = Q.front->next;
num = p->data;
Q.front->next = p->next;
free(p);
cout<<"删除成功,删除的元素是:"<<num<<endl;
return TRUE;
}
Statue CreatQueue(LinkQueue &Q,int len){
QueuePtr p;
cout<<"请输入"<<len<<"个元素:"<<endl;
for(int i=0;i<len;i++){
p = (QueuePtr)malloc(sizeof(QNode));
if(!p){
cout<<"内存申请失败"<<endl;
exit(ERROR);
}
cin>>p->data;
p->next = NULL;
Q.rear->next = p;
Q.rear = p;
}
cout<<"插入成功!"<<endl;
return TRUE;
}
Statue QueueTraverse(LinkQueue Q){
if(Q.front==NULL){
cout<<"队列不存在!"<<endl;
return FALSE;
}
if(Q.front->next==NULL){
cout<<"这是一个空队列!"<<endl;
return FALSE;
}
QueuePtr p;
p = Q.front->next;
cout<<"队列中的元素是:"<<endl;
while(p!=NULL){
cout<<p->data<<" ";
p = p->next;
}
cout<<endl;
return TRUE;
}