遍历生成树邻接表邻接矩阵.docx
- 文档编号:3490747
- 上传时间:2022-11-23
- 格式:DOCX
- 页数:58
- 大小:27.50KB
遍历生成树邻接表邻接矩阵.docx
《遍历生成树邻接表邻接矩阵.docx》由会员分享,可在线阅读,更多相关《遍历生成树邻接表邻接矩阵.docx(58页珍藏版)》请在冰豆网上搜索。
遍历生成树邻接表邻接矩阵
/*各种遍历算法,生成树算法,最小生成树算法(邻接表,邻接矩阵结构)*/
#include
#include
#include
#include
#include
#include
#include
#include
#defineINFINITYINT_MAX/*用整型最大值代替∞*/
#defineMAX_VER26/*顶点最大个数*/
#defineMAX_NAM5/*顶点字符串的最大长度*/
typedefcharVertexType[MAX_NAM];/*顶点类型为字符串*/
typedefintVRType;/*顶点关系类型*/
/*邻接表结构定义*/
typedefstructnode/*链表结点*/
{
VRTypeadj;/*该弧所指向的顶点的位置*/
intwig;/*网的权值*/
structnode*next;/*指向下一条弧的指针*/
}LNode,*Link;
typedefstruct/*表头结点*/
{
VertexTypedata;/*起点信息*/
LNode*first;/*第一个表结点的地址,指向第一条依附该顶点的弧的指针*/
}VNode,AdjList[MAX_VER];
typedefstruct/*邻接链表*/
{
AdjListver;/*表头数组*/
intvex,arc;/*图的当前顶点数和弧数*/
}ALGraph;
/*邻接矩阵结构定义*/
typedefstruct
{
VRTypeadj;/*顶点类型*/
intwig;/*边的权值*/
}ArcCell,AdjMatrix[MAX_VER][MAX_VER];/*二维数组*/
typedefstruct
{
VertexTypevexs[MAX_VER];/*顶点*/
AdjMatrixarcs;/*邻接矩阵*/
intvex,arc;/*图的当前顶点数和弧数*/
intkind;/*无向图1,有向图2*/
}MGraph;
typedefstruct
{/*记录从顶点集U到V-U的代价最小的边的辅助数组定义*/
VertexTypeadjvex;
VRTypelowcost;
}minside[MAX_VER];
intvisited[MAX_VER];
ALGraphGL;MGraphGM;
/*函数说明*/
voidmenu_prog();/*主程序执行菜单*/
intmenu_select();/*主程序选择菜单*/
voidsetpasword();/*建立密码*/
voidmadpasword();/*修改密码*/
voidsetfilesave();/*图形数据文件建立存盘*/
voidmenu_netprog();/*邻接表选项菜单执行系统*/
intmenu_netselect();/*邻接表菜单选择系统*/
voidsetlistunnetwork(ALGraph*G);/*建立邻接表无向网*/
voidsetlistnetwork(ALGraph*G);/*建立邻接表有向网*/
voidDestroyGraph(ALGraph*G);/*销毁图(邻接表)*/
voidprintetwork(ALGraphG);/*输出邻接表*/
intLocateVex(ALGraphG,VertexTypeu);/*则返回该顶点在图中位置*/
voiddfs1(ALGraphG,inti);/*邻接表深度遍历(连通网递归)*/
voiddfs12(ALGraphG,inti);/*邻接表深度遍历(连通网非递归)*/
voiddfs11(ALGraphG,inti);/*邻接表深度遍历(非连通网)*/
voidbfs1(ALGraphG,inti);/*邻接表广度遍历(连通网非递归)*/
voidbfs11(ALGraphG,inti);/*邻接表广度遍历(非连通网)*/
voiddfss1(ALGraphG,inti);/*邻接表深度遍历(生成树递归)*/
voiddfss11(ALGraphG,inti);/*邻接表深度遍历(非连通网生成树)*/
voidbfss1(ALGraphG,inti);/*邻接表广度遍历(生成树非递归)*/
voidbfss11(ALGraphG,inti);/*邻接表深度遍历(非连通网生成树)*/
voidmenu_maprog();/*邻接矩阵菜单执行系统*/
intmenu_maselect();/*邻接矩阵菜单选择系统*/
voidsetmatxunnetwork(MGraph*G);/*建立邻接矩阵无向网*/
voidsetmatxnetwork(MGraph*G);/*建立邻接矩阵有向网*/
voidDestroyGraphs(MGraph*G);/*销毁图(邻接矩阵)*/
voidprintmatx(MGraphG);/*输出邻接矩阵*/
intLocateVexs(MGraphG,VertexTypeu);/*则返回该顶点在图中位置*/
voiddfs2(MGraphG,inti);/*邻接矩阵深度遍历(连通网递归)*/
voiddfs22(MGraphG,inti);/*邻接矩阵深度遍历(非连通网)*/
voidbfs2(MGraphG,inti);/*邻接矩阵广度遍历(连通网非递归)*/
voidbfs22(MGraphG,inti);/*邻接矩阵广度遍历(非连通网)*/
voiddfss2(MGraphG,inti);/*邻接矩阵深度遍历(生成树递归)*/
voiddfss22(MGraphG,inti);/*邻接矩阵深度遍历(非连通网生成树)*/
voidbfss2(MGraphG,inti);/*邻接矩阵广度遍历(生成树非递归)*/
voidbfss22(MGraphG,inti);/*邻接矩阵广度遍历(非连通网生成树)*/
intminimum(minsideSZ,MGraphG);/*求SZ.lowcost的最小正值*/
voidMiniSpanTreePrim(MGraphG,VertexTypeu);/*用普里姆算法构造最小生成树*/
voidkruskal(MGraphG);/*克鲁斯卡尔算法构造网G的最小生成树*/
main()
{/*主程序*/
FILE*fp;
charcha[20],chb[20];
inti=0;
GL.vex=0;
GM.vex=0;
clrscr();/*清屏*/
fp=fopen("pasword.exe","rb");
if(fp==NULL)setpasword();
elsefclose(fp);
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("************************************\n");
printf("**\n");
printf("*数据结构课程设计实例*\n");
printf("**\n");
printf("*图结构遍历生成树操作*\n");
printf("*(邻接表-邻接矩阵)*\n");
printf("**\n");
printf("*作者:
孙俊杰*\n");
printf("**\n");
printf("*2010年1月1日*\n");
printf("**\n");
printf("*初始密码:
1234*\n");
printf("**\n");
printf("**\n");
printf("************************************\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
fp=fopen("pasword.exe","rb");
fgets(cha,81,fp);
printf("请输入密码:
");
gets(chb);
while(strcmp(cha,chb)<0||strcmp(cha,chb)>0)
{
i++;
if(i==3)
{
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("************************************\n");
printf("**\n");
printf("*密码错误无权使用!
!
!
*\n");
printf("**\n");
printf("*谢谢*\n");
printf("**\n");
printf("**\n");
printf("*如想使用本软件请与作者联系*\n");
printf("**\n");
printf("*2010年1月1日*\n");
printf("**\n");
printf("************************************\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
scanf("%*c");
exit(0);
}
printf("密码错误!
!
!
\n");
printf("请输入密码:
");
gets(chb);
}
menu_prog();
}
voidmenu_prog()
{/*主程序选项菜单执行系统*/
charch;intk;
VertexTypeva;
for(;;)
{
switch(menu_select())
{
case1:
printf("是否建立新的图形文件?
(y/n)");
scanf("%c%*c",&ch);
if(ch=='y')setfilesave();/*图形文件数据建立存盘*/
printf("按任意键继续.........");
getch();
break;
case2:
menu_netprog();/*邻接表选项菜单执行系统*/
printf("按任意键继续.........");
getch();
break;
case3:
menu_maprog();/*邻接矩阵菜单执行系统*/
printf("按任意键继续.........");
getch();
break;
case4:
printf("现在系统状态是:
邻接矩阵(无向网)!
!
!
\n");
setmatxunnetwork(&GM);/*建立邻接矩阵无向网*/
printf("按任意键继续.........");
getch();
printf("现在系统状态是:
邻接矩阵(无向网)!
!
!
\n");
printmatx(GM);/*输出图的邻接矩阵GM*/
printf("按任意键继续.........");
getch();
printf("由普里姆算法构造网G的最小生成树:
\n");
printf("输入最小生成树的起点va\n");
printf("当输入y时退出遍历:
");
scanf("%s",&va);
k=LocateVexs(GM,va);
while(k>=0&&k { printf("以顶点%s为起点的普里姆最小生成树: \n",va); MiniSpanTreePrim(GM,va); printf("\n"); printf("输入最小生成树的起点va\n"); printf("当输入y时退出遍历: "); scanf("%s",&va); k=LocateVexs(GM,va); } printf("按任意键继续........."); getch(); DestroyGraphs(&GM);/*销毁图(邻接矩阵)*/ break; case5: printf("现在系统状态是: 邻接矩阵(无向网)! ! ! \n"); setmatxunnetwork(&GM);/*建立邻接矩阵无向网*/ printf("按任意键继续........."); getch(); printf("现在系统状态是: 邻接矩阵(无向网)! ! ! \n"); printmatx(GM);/*输出图的邻接矩阵GM*/ printf("按任意键继续........."); getch(); printf("由克鲁斯卡尔算法构造网G的最小生成树: \n"); kruskal(GM); printf("按任意键继续........."); getch(); DestroyGraphs(&GM);/*销毁图(邻接矩阵)*/ break; case6: madpasword();/*修改密码*/ printf("按任意键继续........."); getch(); break; case7: exit(0); } } } intmenu_select() {/*选项菜单系统*/ chars[8]; intc; clrscr();/*清屏*/ printf("\n"); printf("\n"); printf("************************************\n"); printf("**\n"); printf("**\n"); printf("*图形结构遍历基本操作窗口*\n"); printf("**\n"); printf("**\n"); printf("************************************\n"); printf("\n"); printf("01: 图形数据文件建立存盘\n"); printf("02: 邻接表(有向无向网)\n"); printf("03: 邻接矩阵(有向无向网)\n"); printf("04: 最小生成树(普里姆)\n"); printf("05: 最小生成树(克鲁斯)\n"); printf("06: 修改系统的密码操作\n"); printf("07: 退出系统\n"); do{ printf("\n"); printf("输入你的选择号: 1---7: "); gets(s); c=atoi(s); }while(c<0||c>7); return(c); } voidmenu_netprog() {/*邻接表选项菜单执行系统*/ inti,j,k,s; charch; VertexTypeva; for(;;) { i=menu_netselect(); switch(i) { case1: if(GL.vex! =0) { printf("\n系统中已经存在邻接表(有向网)结构! ! ! "); printf("\n请选择销毁后重新更换(无向网)结构! ! ! "); printf("\n"); printf("按任意键继续........."); getch(); break; } else{ s=1; printf("现在系统状态是: 邻接表(无向网)! ! ! \n"); setlistunnetwork(&GL);/*建立邻接表无向网*/ printetwork(GL);/*输出图的邻接表GL*/ printf("按任意键继续........."); getch(); break; } case2: if(GL.vex! =0) { printf("\n系统中已经存在邻接表(无向网)结构! ! ! "); printf("\n请选择销毁后重新更换(有向网)结构! ! ! "); printf("\n"); printf("按任意键继续........."); getch(); break; } else{ s=2; printf("现在系统状态是: 邻接表(有向网)! ! ! \n"); setlistnetwork(&GL);/*建立邻接表有向网*/ printetwork(GL);/*输出图的邻接表GL*/ printf("按任意键继续........."); getch(); break; } case3: if(GL.vex==0) { printf("\n系统中没有邻接表结构! 不能输出! ! ! "); printf("\n请建立邻接表之后再输出! ! ! "); printf("\n"); printf("按任意键继续........."); getch(); break; } else{ if(s==1)printf("现在系统状态是: 邻接表(无向网)! ! ! \n"); elseprintf("现在系统状态是: 邻接表(有向网)! ! ! \n"); printetwork(GL);/*输出图的邻接表GL*/ printf("按任意键继续........."); getch(); break; } case4: if(GL.vex==0) { printf("\n系统中没有邻接表结构! 不能遍历! ! ! "); printf("\n请建立邻接表之后再进行遍历! ! ! "); printf("\n"); printf("按任意键继续........."); getch(); break; } else{ if(s==1)printf("现在系统状态是: 邻接表(无向网)! ! ! \n"); elseprintf("现在系统状态是: 邻接表(有向网)! ! ! \n"); printf("无向连通图的深度遍历(邻接表)\n"); printf("打印无向连通图\n"); printetwork(GL); printf("\n"); printf("输入邻接表(连通-非连通)遍历(深度)的起始点va: \n"); printf("当输入y时退出遍历: "); scanf("%s",&va); k=LocateVex(GL,va); while(k>0&&k<=GL.vex) { for(j=1;j<=GL.vex;j++)visited[j]=0; dfs11(GL,k); printf("\n\n"); printf("输入邻接表(连通-非连通)遍历(深度)的起始点va: \n"); printf("当输入y时退出遍历: "); scanf("%s",&va); k=LocateVex(GL,va); } printf("按任意键继续........."); getch(); break; } case5: if(GL.vex==0) { printf("\n系统中没有邻接表结构! 不能遍历! ! ! "); printf("\n请建立邻接表之后再进行遍历! ! ! "); printf("\n"); printf("按任意键继续........."); getch(); break; } else{ if(s==1)printf("现在系统状态是: 邻接表(无向网)! ! ! \n"); elseprintf("现在系统状态是: 邻接表(有向网)! ! ! \n"); printf("无向连通图的广度遍历(邻接表)\n"); printf("打印无向连通图\n"); printetwork(GL); printf("\n"); printf("输入邻接表(连通-非连通)遍历(广度)的起始点va: \n"); printf("当输入y时退出遍历: "); scanf("%s",&va); k=LocateVex(GL,va); while(k>0&&k<=GL.vex) { for(j=1;j<=GL.vex;j++)visited[j]=0; bfs11(GL,k); printf("\n\n"); printf("输入邻接表(连通-非连通)遍历(广度)的起始点va: \n"); printf("当输入y时退出遍历: "); scanf("%s",&va); k=LocateVex(GL,va); } printf("按任意键继续........."); getch(); break; } case6: if(GL.vex==0) { pr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遍历 生成 邻接 邻接矩阵