实验六 图的创建及应用(I)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
姓名学号
算本次实验主函数采用循环选择结构,主函数调用自己编写的头文件DataStructure_Graph.h中的相关功能函数,完成实验要求。
主程序结构:
1、邻接矩阵表示法:
1、创建有向图;//调用CreateGraph(MG)创建有向图
2、显示图信息;//调用DisplayGraph(MG) 显示图信息
3、返回上一界面;
2、邻接表表示法:
1、创建有向图; //调用CreateGraph(ALG)创建有向图
2、显示图信息;//调用DisplayGraph(ALG) 显示图信息
3、返回上一界面;
3、基于深度优先搜索判断是否存在指定位置的路径:
1、使用已创建的邻接表表示的图进行搜索判断;//调用exist_path_DFS(ALG, i, j)搜索
2、创建新的图进行搜索判断;//创建新的有向图,并调用exist_path_DFS(R_ALG, i, j)搜索
3、返回上一界面;
4、退出程序
创建图的算法分析
邻接矩阵结构创建图:
首先由键盘输入待创建的图的顶点数,弧数以及是否含有弧信息,然后由顶点数控制循环构造顶点向量,接着由顶点数控制循环初始化邻接矩阵(adj=0,info=NUll),再次输入弧信息,此时将输入的弧的弧头和弧尾与顶点信息进行匹配,从而确定弧在邻接矩阵中的位置(有弧时为1),如果输入的弧有信息的话,在进行有无弧的判断写邻接矩阵时进行绑定,有键盘输入即可。
邻接表结构创建图:
首先由键盘输入待创建的图的顶点数,弧数,然后由顶点数控制循环初始化顶点信息(顶点数据信息及顶点第一条弧指针(firstarc = NULL)),接着由弧数控制循环输入弧头和弧尾顶点,与之前建立的顶点信息进行匹配,从而确定弧头和弧尾的位置信息,此时生成一个弧结点类型的存储空间,采用单链表中在表头插入新结点的方法,将弧的信息插入到顶点的第一条弧之后,如同此法,对每个顶点都进行以上操作,这就建立了图的邻接表结构。
深度优先搜索判断是否存在指定位置的路径算法分析
首先判断指定的两个位置向量是否相等,如果相等,则肯定有路径相连,否则从指定的弧头结点开始搜索,将该顶点访问过的弧的访问标志置1,任何到该弧的弧头顶点进行如上操作,当搜索该顶点的所有弧都没有找到则返回0,然后返回上一顶点,对该顶点的其他弧进行访问。当指定顶点的所有弧都被搜索访问过都没有找到,此时程序返回0。
cout << endl << ">请选择功能:";
cin >> ch1;
switch (ch1)
{
case'1': //创建有向图
{
system("cls");
CreateGraph(MG);
cout << "操作完毕!" << endl;
system("pause");
system("cls");
continue;
}
case'2': //显示图信息
{
system("cls");
DisplayGraph(MG);
cout << "操作完毕!" << endl;
system("pause");
system("cls");
continue;
}
case'3': //返回上一界面
{
break;
}
default:
{
system("cls");
cout << "输入错误,请重新输入!" << endl;
continue;
}
}
system("cls");
break;
}
break;
}
case'2':
{
system("cls");
while (1)
{
minor_menu2();
char ch1;//二层菜单输入选择
cout << endl << ">请选择功能:";
cin >> ch1;
switch (ch1)
{
case'1'://创建图信息
{
system("cls");
CreateGraph(ALG);
cout << "操作完毕!" << endl;
system("pause");
system("cls");
continue;
}
case'2'://显示图信息
{
system("cls");
DisplayGraph(ALG);
cout << "操作完毕!" << endl;
system("pause");
system("cls");
continue;
}
case'3': //返回上一界面
{
break;
}
default:
{
system("cls");
cout << "输入错误,请重新输入!" << endl;
continue;
}
}
system("cls");
break;
}
break;
}
case'3':
{
system("cls");
while (1)
{
minor_menu3();
ALGraph R_ALG;
int i, j; //待搜索的顶点的位置
char ch1; //二层菜单输入选择
cout << endl << ">请选择功能:";
cin >> ch1;
switch (ch1)
{
case'1'://使用已创建的邻接表表示的图进行搜索
{
system("cls");
cout << "请输入待搜索的顶点v(i) 顶点v(j)(以空格分隔):";
cin >> i>> j;
int flag = exist_path_DFS(G, i, j);
if (flag)
cout << "搜索成功!存在顶点v(i):" << G.vertices[i].data << "顶点v(j):" << G.vertices[j].data << "的路径" << endl;
else
cout << "搜索失败!不存在顶点v(i):" << G.vertices[i].data << "到顶点v(j):" << G.vertices[j].data << "的路径" << endl;
cout << "操作完毕!" << endl;
system("pause");
system("cls");
continue;
}
case'2': //创建新图进行搜索
{
system("cls");