#include
//c++输入和输出等 如cout
#include
//c输入和输出等
如getch
#include
//窗口类操作,系统调用如清屏等
enum
returninfo{success,fail,underflow,range_error};//定义错误类型清单
class
node
{
public:
int
data; //数据域
node
*next; //结点指针
};
class
linkqueue
{
private:
node *rear;
node *front;
protected:
int
count;
//计数器
统计结点个数即线性队列的长度
public:
linkqueue();
//构造函数
~linkqueue();
//析构函数
void
clearqueue(void);
//清空链队
bool empty(void)
const;
//判断是否空队
int size(void)
const;
//求链队的长度
returninfo
traverse(void);
//遍历链队所有元素
returninfo getfront(int &item)
const;
//读取队头
returninfo insert(const int
&item);
//数据入队
returninfo remove(int
&item);
//数据出队
};
linkqueue::linkqueue()
//构造函数
{
front=new
node;
//申请新结点,作为队头结点
front->next=NULL;
rear=front;
//队尾指针指向队头
count=0;
//计数器清零,队列开始时没有实际数据
}
linkqueue::~linkqueue()
//析构函数
{
clearqueue();
//删除所有数据,释放所有结点
delete
front;
//把头结点也释放掉
count=0;
//计数器清零,队列明开始时没有实际数据
}
void
linkqueue::clearqueue(void)
//清空链队
{
node
*searchp=front->next,*followp=front;
//初始化两个指针
while(searchp!=rear)
{
followp=searchp;
searchp=searchp->next;
delete followp;
}
front->next=NULL;
//保留了最后一个结点,就是头结点,并且链域置为空
rear=front;
count=0;
//计数器也清零
}
bool
linkqueue::empty(void)const
//是否空链
{
if(count==0)
return true;
else
return false;
}
int
linkqueue::size(void)const
//求链队的长度
{
return
count;
}
returninfo
linkqueue::traverse(void)
//遍历链队中的所有元素
{
node
*searchp;
//启用搜索指针
if(empty())
return
underflow;
//空队列的处理
searchp=front->next;
cout<<"链队中的全部数据为:
Front━>头结点->";
//提示显示数据开始
while(searchp!=rear->next)
//循环显示所有数据
{
cout<<"
"<<searchp->data;
if (searchp==rear)
cout<<" <</font>━";
else
cout<<" ->";
searchp=searchp->next;
}
cout<<"
Rear"<<endl;
//最后有一个回车的控制
return
success;
//本次操作成功
}
returninfo
linkqueue::getfront(int &item)
const //读取队头
{
if(empty())
//处理意外
return
underflow;
item=front->next->data;
//返回读取的数据
return
success;
//本次操作成功
}
returninfo
linkqueue::insert(const int
&item)
//进队
{
node *newnodep=new node;
newnodep->data=item;
//给数据赋值
rear->next=newnodep;
//这一步可以看出有头结点
rear=rear->next;
//改动队尾指针的位置
count++;
//计数器加一
return success;
}
returninfo
linkqueue::remove(int
&item)
//出队
{
if(empty())
return underflow;
node *tempp=front->next;
item=tempp->data;
front->next=tempp->next;
//改变指针
delete
tempp;
//释放该结点
count--;
//计数器减一
return success;
}
class
interfacebase
{
private:
linkqueue queueonface;
public:
void clearscreen(void);
void showmenu(void);
int userchoice(void);
returninfo processmenu(int menuchoice);
};
void
interfacebase::clearscreen(void)
{
system("cls");
}
void
interfacebase::showmenu(void)
{
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<<"=========="<<endl;
}
int
interfacebase::userchoice(void)
{
int menuchoice;
cout<<"请输入您的选择:";
cin>>menuchoice;
return menuchoice;
}
returninfo
interfacebase::processmenu(int menuchoice)
{
int item,returnvalue;
switch(menuchoice)
//根据用户的选择进行相应的操作
{
case 1:
cout<<"请输入要进队的新数据:";
cin>>item;
returnvalue=queueonface.insert(item);
cout<<"进队操作成功!请按任意键继续..."<<endl;
break;
case 2:
returnvalue=queueonface.remove(item);
if(returnvalue==underflow)
cout<<"对不起,链队已空!请按任意键继续..."<<endl;
else
{
cout<<"出队数据为:"<<item<<endl;
cout<<"出队操作成功!请按任意键继续..."<<endl;
}
break;
case 3:
returnvalue=queueonface.traverse();
if(returnvalue==underflow)
cout<<"链队目前为空,没有数据可以显示!请按任意键继续..."<<endl;
else
cout<<"链队遍历操作成功!请按任意键继续..."<<endl;
break;
case 4:
if(queueonface.empty())
cout<<"此时链队为空!请按任意键继续..."<<endl;
else
cout<<"此时链队不为空!请按任意键继续..."<<endl;
break;
case 5:
returnvalue=queueonface.getfront(item);
if(returnvalue==underflow)
cout<<"对不起,链队已空!请按任意键继续..."<<endl;
else
cout<<"队头数据为:"<<item<<endl<<"读取操作成功!请按任意键继续..."<<endl;
break;
case 6:
cout<<"链队目前的长度为:
"<<queueonface.size()<<endl;
cout<<"求链队长度操作成功!请按任意键继续..."<<endl;
break;
case
7:
exit(0);
default:
cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl;
break;
}
return success;
}
void
main(void)
//程序主入口
{
int
menuchoice;
//下面要用到
interfacebase interfacenow;
linkqueue linkqueuenow;
interfacenow.clearscreen();
while (1)
{
interfacenow.showmenu();
menuchoice=interfacenow.userchoice();
interfacenow.processmenu(menuchoice);
getch();
Sleep(200);
//延迟了一会
interfacenow.clearscreen();
}
}//主函数结束