求助!!设计一个基于DOS菜单的应用程序
设计一个基于DOS菜单的应用程序。要利用多级菜单实现各种功能。内容如下:1. 无向图的基本操作及应用
① 创建无向图的邻接矩阵
② 创建无向图的邻接表
③ 无向图的深度优先遍历
④ 无向图的广度优先遍历
2. 无向网的基本操作及应用
① 创建无向网的邻接矩阵
② 创建无向网的邻接表
③ 求最小生成树
3. 有向图的基本操作及应用
① 创建有向图的邻接矩阵
② 创建有向图的邻接表
③ 拓扑排序
4. 有向网的基本操作及应用
① 创建有向网的邻接矩阵
② 创建有向网的邻接表
③ 关键路径
④ 单源最短路径
⑤ 每对顶点之间的最短路径
三.设计指导
第一步:根据设计任务,设计DOS菜单。例如
选择1之后应该类似于
第二步:设计菜单
void ShowMainMenu()
{
cout<<"\n";
cout<<" ***************图的基本操作及应用******************\n";
cout<<" * 1 无向图的基本操作及应用 *\n";
cout<<" * 2 无向网的基本操作及应用 *\n";
cout<<" * 3 有向图的基本操作及应用 *\n";
cout<<" * 4 有向网的基本操作及应用 *\n";
cout<<" * 5 退出 *\n";
cout<<" ***************************************************\n";
}
void UDG()
{
MGraph MG;
ALGraph ALG;
int n;
do
{
cout<<"\n";
cout<<" ***************无向图的基本操作及应用***************\n";
cout<<" * 1 创建无向图的邻接矩阵 *\n";
cout<<" * 2 创建无向图的邻接表 *\n";
cout<<" * 3 无向图的深度优先遍历 *\n";
cout<<" * 4 无向图的广度优先遍历 *\n";
cout<<" * 5 退出 *\n";
cout<<" ****************************************************\n";
cin>>n;
switch(n){
case 1:
CreatUDG_M(MG);
break;
case 2:
CreatUDG_ALG(ALG);
dispgraph(ALG);
break;
case 3:
break;
case 4:
break;
default:
if (n!=5)
cout<<"错误,重新输入\n";
}
}while(n!=5);
}
void UDN()
{
MGraph MN;
ALGraph ALN;
int n;
do{
cout<<"\n";
cout<<" ***************无向网的基本操作及应用***************\n";
cout<<" * 1 创建无向网的邻接矩阵 *\n";
cout<<" * 2 创建无向网的邻接表 *\n";
cout<<" * 3 prim算法求最小生成树 *\n";
cout<<" * 4 kraskal算法求最小生成树 *\n";
cout<<" * 5 退出 *\n";
cout<<" ****************************************************\n";
cin>>n;
switch(n){
case 1:
CreatUDN_M(MN);
break;
case 2:
CreatUDN_ALG(ALN);
dispgraph_N(ALN);
break;
case 3:
break;
case 4:
break;
default:
if (n!=5)
cout<<"错误,重新输入\n";
}
}while(n!=5);
}
void DG()
{
int n;
do
{
cout<<"\n";
cout<<" ***************有向图的基本操作及应用***************\n";
cout<<" * 1 创建有向图的邻接矩阵 *\n";
cout<<" * 2 创建有向图的邻接表 *\n";
cout<<" * 3 拓扑排序 *\n";
cout<<" * 4 退出 *\n";
cout<<" ****************************************************\n";
cin>>n;
switch(n){
case 1:
break;
case 2:
break;
case 3:
break;
default:
if (n!=4)
cout<<"错误,重新输入\n";
}
}while(n!=4);
}
void DN()
{
int n;
do{
cout<<"\n";
cout<<" ***************有向网的基本操作及应用***************\n";
cout<<" * 1 创建有向网的邻接矩阵 *\n";
cout<<" * 2 创建有向网的邻接表 *\n";
cout<<" * 3 关键路径 *\n";
cout<<" * 4 单源顶点最短路径问题 *\n";
cout<<" * 5 每对顶点间最短路径问题 *\n";
cout<<" * 6 退出 *\n";
cout<<" ****************************************************\n";
cin>>n;
switch(n){
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
default:
if (n!=6)
cout<<"错误,重新输入\n";
}
}while(n!=6);
}
void main()
{
int n;
do{
ShowMainMenu();
cin>>n;
switch(n){
case 1:
UDG();
break;
case 2:
UDN();
break;
case 3:
DG();
break;
case 4:
DN();
break;
default:
if (n!=5)
cout<<"错误,重新输入\n";
}
}while(n!=5);
}
无论多少级菜单,都可以用这种模式实现,并且当前菜单不用担心前面的问题,只需编写当前的功能函数。
第三步:添加功能函数。
对于使用类来做的同学,根据实际使用,我们知道菜单类的主要功能就是显示菜单项与响应用户选项。所以我们可以这样设计一个菜单基类:
class CMenuBase
{
public:
CMenuBase(void);
~CMenuBase(void);
virtual void ShowMenu()=0;
virtual void Event(int EvenID)=0;
protected:
CMenuBase* m_pParent;
};
在此基础上,所有菜单类都继承这个类,以此来实现“显示”与“响应事件”的多态性。例如,主菜单类的设计为:
class CMainMenu:public CMenuBase
{
public:
CMainMenu(void);
~CMainMenu(void);
virtual void ShowMenu();
virtual void Event(int EvenID);
};
和基类基本没有区别。其实现可能为
void CMainMenu::ShowMenu(){
cout<<"\n **************《数据结构课程设计》*****************\n";
cout<<" * 1 线性表 2 栈与队列 3 串、数组和广义表 *\n";
cout<<" * 4 树 5 图 6 查找 *\n";
cout<<" * 7 排序 8 退出 *\n";
cout<<" ***************************************************\n";
}
void CMainMenu::Event(int EvenID){
CMenuBase*tmp;
switch(EvenID){
case ID_LIST:
break;
case ID_STACK_QUEUE:
SUBMENU(CStackAndQueueMenu)
break;
//…………………
case ID_EXIT:
MAIN_EXIT=true;
break;
default:
InvalidateAction();
break;
}
}
注意:这里的关键是如何进入子菜单,我们用了一个宏命令,例如SUBMENU(CListMenu),其定义为:
#define SUBMENU(submenu) tmp=pBase;\
pBase=new submenu(tmp);\
pBase->ShowMenu();
通过构造函数,将当前菜单对象作为子菜单的父菜单,以后推出子菜单时,子菜单将将显示权让给其父菜单:
#define EXIT_SUBMENU tmp=m_pParent;\
delete pBase;\
pBase=tmp;\
pBase->ShowMenu();
这样设计,无论有多少级菜单,其编程风格都是一样的,只需管理当前的菜单交接,而无需知道它是从哪儿来的。