目录
一、main
#include <iostream>
#include "com.h"
using namespace std ;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv) {
LinkQueue Q ;
int i , number , choice , n;
QElemType e ;
do
{
printf("\t\t\t==================================================\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 链队列基本操作 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t|================================================|\n");
printf("\t\t\t| 请选择要操作的命令 |\n");
printf("\t\t\t|------------------------------------------------|\n");
printf("\t\t\t| |\n");
printf("\t\t\t| 0.退出整个系统 1.初始化队列 |\n");
printf("\t\t\t| 2.初始输入元素 3.队列是否为空 |\n");
printf("\t\t\t| 4.查看队列的长度 5.取队头元素 |\n");
printf("\t\t\t| 6.入队 7.出队 |\n");
printf("\t\t\t| 8.遍历队列 9.清空队列 |\n");
printf("\t\t\t| 10.销毁队列 |\n");
printf("\t\t\t| |\n");
printf("\t\t\t==================================================\n");
printf("选择(0---13):\t");
cin >> choice ;
switch(choice)
{
case 0 : //0.退出整个系统
cout << "退出成功" ;
exit(0) ;
case 1 :// 1.初始化栈队列
InitQueue(Q) ;
cout << "初始化成功" ;
cout << endl ;
break ;
case 2 : //2.初始输入元素
cout << "请输入需要入队列的数据个数:" ;
cin >> n ;
cout << "请输入需要入队列的"<<n<<"个数据,用空格隔开:"<<endl ;
for(i = 1 ; i <= n ; i ++)
{
cin >> e ;
EnQueue(Q , e) ;
}
cout << endl ;
cout << "现队列为:" ;
if(QueueTraverse(Q) == ERROR) cout << "空队列" ;
cout << endl ;
break ;
case 3 : // 3.队列是否为空
cout << "现队列为:" ;
if(QueueTraverse(Q) == ERROR) cout << "空队列" ;
cout << endl ;
if(QueueEmpty(Q)) cout << "该队列为空" ;
else cout << "该队列不为空" ;
cout << endl ;
break ;
case 4 : // 4.查看队列的长度
cout << "现队列为:" ;
if(QueueTraverse(Q) == ERROR) cout << "空队列" ;
cout << endl ;
cout << "栈的长度为:" << QueueLength(Q) ;
cout << endl ;
break ;
case 5 : //5.取队头元素
cout << "现队列为:" ;
if(QueueTraverse(Q) == ERROR) cout << "空队列" ;
cout << endl ;
cout << "队头元素为 " << GetHead(Q) ;
cout << endl ;
break ;
case 6 : // 6.入队
cout << "请输入入队元素:" ;
cin >> e ;
if(EnQueue(Q , e) == OK) cout << "入队成功" ;
cout << endl ;
cout << "现队列为:" ;
if(QueueTraverse(Q) == ERROR) cout << "空队列" ;
cout << endl ;
break ;
case 7 : // 7. 出队
if(DeQueue(Q , e) == ERROR) cout << "该队列为空,操作失败" ;
else cout << "队头元素 " << e << " 已出队" ;
cout << endl ;
cout << "现队列为:" ;
if(QueueTraverse(Q) == ERROR) cout << "空队列" ;
cout << endl ;
break ;
case 8 : //8.遍历队列
cout << "队中元素为:" ;
if(QueueTraverse(Q) == ERROR) cout << "空队列" ;
cout << endl ;
break ;
case 9 : // 9.清空队列
if(ClearQueue(Q) == OK) cout << "该队列已被清空" ;
cout << endl ;
break ;
case 10 : // 10.销毁队列
if(DestoryQueue(Q) == OK) cout << "该队列已被销毁" ;
cout << endl ;
break ;
default :
cout << "输入不合法,请重新输入" ;
cout << endl ;
}
}while(choice != 0) ;
return 0;
}
二、function
#include <iostream>
#include "com.h"
using namespace std ;
//初始化
Status InitQueue(LinkQueue &Q)
{
Q.front = Q.rear = new QNode ;
Q.front->next = NULL ; // 头指针指向空
return OK ;
}
// 判空
bool QueueEmpty(LinkQueue Q)
{
if(Q.front == Q.rear) return true ;
else return false ;
}
// 队长
int QueueLength(LinkQueue Q)
{
int len = 0 ;
while(Q.front != Q.rear)
{
len ++ ;
Q.front = Q.front->next ;
}
return len ;
}
// 入队
Status EnQueue(LinkQueue &Q , QElemType e)
{
QueuePtr p ; // 注意,用Queueptr 定义
p = new QNode ;
p->data = e ;
p->next = NULL ; // p插入到rear后面,p的next为空
Q.rear->next = p ; // rear指向p,插入
Q.rear = p ; // rear要在最后
return OK ;
}
// 出队
Status DeQueue(LinkQueue &Q , QElemType &e)
{
if(Q.front == Q.rear) return ERROR ; // 空我,无法删除
QueuePtr p ; //
p = Q.front->next ; // 头结点的下一个,先保存在p
e = p->data ; // 将要删除的结点data传给e
Q.front->next = p->next ; // front指向下一个
if(p == Q.rear) Q.rear = Q.front ; // 如果只有一个结点
delete p ; // 删除
return OK ;
}
// 取队头
QElemType GetHead(LinkQueue Q)
{
if(Q.rear != Q.front)
return Q.front->next->data ;
}
// 遍历
Status QueueTraverse(LinkQueue Q)
{
if(Q.front == Q.rear) return ERROR ;
QueuePtr p ;
p = Q.front->next ;
while(p)
{
cout << p->data << " " ;
p = p->next ;
}
return OK ;
}
// 清空
Status ClearQueue(LinkQueue &Q)
{
// 释放除头结点的所有空间
//先将队尾指针指向对头指针的下一个结点
Q.rear = Q.front->next ; // 先指向首结点
while(Q.front->next)
{
Q.rear = Q.rear->next ;// 队尾指针后移
delete Q.front->next ; //释放对头指针和队尾指针中间的结点
Q.front->next = Q.rear ;
}
Q.rear = Q.front ; // 指向同一个空
return OK ;
}
// 摧毁
Status DestoryQueue(LinkQueue &Q)
{
while(Q.front)
{
Q.rear = Q.front->next ; // rear后移
delete Q.front ;
Q.front = Q.rear ;
}
return OK ;
}
三、com
//#ifndef _FUNC_H
//#define _FUNC_H
#define OK 0
#define ERROR -1
#define OVERFLOW -2
typedef int QElemType ;
typedef int Status ;
typedef struct QNode
{
QElemType data ;
struct QNode *next ;
}QNode , *QueuePtr ;
typedef struct
{
QueuePtr front ;
QueuePtr rear ;
}LinkQueue ;
extern Status InitQueue(LinkQueue &Q) ;
extern bool QueueEmpty(LinkQueue Q) ;
extern Status EnQueue(LinkQueue &Q , QElemType e) ;
extern Status DeQueue(LinkQueue &Q , QElemType &e) ;
extern QElemType GetHead(LinkQueue Q) ;
extern Status ClearQueue(LinkQueue &Q) ;
extern Status DestoryQueue(LinkQueue &Q) ;
extern int QueueLength(LinkQueue Q) ;
extern Status QueueTraverse(LinkQueue Q) ;
//#endif