第十六周结课了,所以都在复习
第十七周做实践作业,用赋权无向图做个校园导游程序
这里放一下图的定义、初始化、显示矩阵、查询、修改(更新)和添加函数
结构体定义
1 /*路径的定义*/ 2 typedef struct{ 3 int metre; /*距离,单位米*/ 4 char LJinfo[MAX]; /*路线信息或吐槽,MAX请自行定义值*/ 5 }LuJing; 6 7 /*景点信息的定义*/ 8 typedef struct{ 9 int Num; /*景点编号*/ 10 char MingCheng[MAX]; /*景点名称*/ 11 char JDinfo[MAX]; /*景点信息,简介或吐槽*/ 12 }JingDian; 13 14 /*校园图(邻接矩阵)的定义)*/ 15 typedef struct{ 16 int Vexnum,Arcnum; /*图的景点数量和路线数量*/ 17 JingDian vex[MAX]; /*景点*/ 18 LuJing Arcs[MAX][MAX]; /*邻接矩阵*/ 19 }SchoolMap;
初始化图的内容
1 /*初始化校园导游图的内容*/ 2 void jiantu(SchoolMap *G){ 3 int i,j; 4 G->Vexnum=8; //8个景点 5 G->Arcnum=12; //12条路线 6 7 for(i=1;i<=G->Vexnum;i++) //初始化景点间的距离 8 for(j=1;j<=G->Vexnum;j++) 9 G->Arcs[i][j].metre=INF; //INF无穷表示各景点间没有连接,INF请自行定义值 10 11 for(i=1;i<=G->Vexnum;i++)//我这边下标是从1开始的 12 for(j=1;j<=G->Vexnum;j++) 13 if(i==j) G->Arcs[i][j].metre=0; //将景点自身距离重置为0 14 15 /*1景点,2景点,3景点……8景点*/ 16 for(i=1;i<=G->Vexnum;i++) 17 G->vex[i].Num=i; //初始化景点编号(因为就按顺序来的,所以后面调用可能会直接用i哈哈 18 19 strcpy(G->vex[1].MingCheng,"名称"); 20 strcpy(G->vex[1].JDinfo,"景点的简介 "); 21 G->Arcs[1][2].metre=200; /*无向图要注意来回都要写*/ 22 G->Arcs[2][1].metre=200; 23 strcpy(G->Arcs[1][2].LJinfo,"1景点去2景点的道路信息"); 24 strcpy(G->Arcs[2][1].LJinfo,"来回路可以写一样,看你的需求"); 25 G->Arcs[1][3].metre=350; /*1景点到3景点*/ 26 G->Arcs[3][1].metre=350; 27 strcpy(G->Arcs[1][3].LJinfo,"同上"); 28 strcpy(G->Arcs[3][1].LJinfo,"同上"); 29 //后面景点的初始化类似就不展开了,景点越多写的越多 30 }
显示
1 /*1显示校园地图*/ 2 void Show(SchoolMap *G){ 3 int i,j; 4 printf(" "); 5 for(i=1;i<=G->Vexnum;i++) 6 printf("%-10s",G->vex[i].MingCheng); /*第一行名称,%-10s为了排版好看,下同*/ 7 8 printf(" "); 9 for(i=1;i<=G->Vexnum;i++) 10 { 11 printf("%11s ",G->vex[i].MingCheng); /*左边名称纵列*/ 12 for(j=1;j<=G->Vexnum;j++) 13 { 14 if(G->Arcs[i][j].metre!=INF) 15 printf("%-10d",G->Arcs[i][j].metre); 16 else 17 printf("%-10s","∞"); //不想直接打数字,所以用无穷的符合来替换啦 18 } 19 printf(" "); 20 } 21 22 printf(" ————————————————————我只是条分割线,别看我(/ω\)—————————————————— "); 23 }
查询景点简介
1 /*2查询景点的简介*/ 2 void ChaXunJDjianjie(SchoolMap *G){ 3 int i,kkr; 4 5 printf(" "); 6 for(i=1;i<=G->Vexnum;i++) 7 printf("%d%s ",i,G->vex[i].MingCheng); 8 printf(" (^_^)/请输入景点编号来查询景点的简介:"); 9 scanf("%d",&kkr); 10 11 if(kkr==G->vex[kkr].Num) 12 { 13 printf(" %s的简介为:%s",G->vex[kkr].MingCheng,G->vex[kkr].JDinfo); 14 } 15 else printf(" 查询失败(看看是不是输错了)-_-# "); 16 17 printf(" ————————————————————我只是条分割线,别看我(/ω\)—————————————————— "); 18 }
查询景点间的道路
1 /*3查询景点间的道路*/ 2 void ChaXunJDdaolu(SchoolMap *G){ 3 int i,z=0,x=0; 4 5 printf(" "); 6 for(i=1;i<=G->Vexnum;i++) 7 printf("%d%s ",i,G->vex[i].MingCheng); 8 printf(" (^_^)/请输入起止景点编号来查询景点间的道路 景点1的编号和景点2的编号(空格隔开):"); 9 fflush(stdin); /*消除前面回车的影响*/ 10 scanf("%d %d",&z,&x); 11 if(G->Arcs[z][x].metre>0 && G->Arcs[z][x].metre<INF) 12 printf(" %s到%s的道路信息:%s ",G->vex[z].MingCheng,G->vex[x].MingCheng,G->Arcs[z][x].LJinfo); 13 else 14 printf(" 查询失败(两个景点间没有直接线路,或者看看是不是输错数字了)-_-# "); 15 16 printf(" ————————————————————我只是条分割线,别看我(/ω\)—————————————————— "); 17 }
更新(修改)景点简介
1 /*4更新景点简介*/ 2 void UpdateJDinfo(SchoolMap *G){ 3 int i,kkr; 4 char c1[MAX]; 5 printf(" "); 6 for(i=1;i<=G->Vexnum;i++) 7 printf("%d%s ",i,G->vex[i].MingCheng); 8 printf(" (^_^)/请选择要更新的景点简介(输入数字):"); 9 scanf("%d",&kkr); 10 11 if(kkr==G->vex[kkr].Num) 12 { 13 printf(" %s的简介为:%s (^_^)/请输入新的景点简介:",G->vex[kkr].MingCheng,G->vex[kkr].JDinfo); 14 fflush(stdin); /*消除前面回车的影响*/ 15 scanf("%s",c1); 16 strcpy(G->vex[kkr].JDinfo,c1); 17 printf(" %s的简介已更新为:%s ",G->vex[kkr].MingCheng,G->vex[kkr].JDinfo); 18 } 19 else printf(" 咦~!没有找到这个景点呢,看看是不是输错了-_-# "); 20 21 printf(" ————————————————————我只是条分割线,别看我—————————————————— "); 22 }
更新(修改)道路信息
1 /*5更新道路信息*/ 2 void UpdateLJinfo(SchoolMap *G){ 3 int i,z=0,x=0,pd=0; 4 char c1[MAX]; 5 printf(" "); 6 for(i=1;i<=G->Vexnum;i++) 7 printf("%d%s ",i,G->vex[i].MingCheng); 8 printf(" (^_^)/请输入起止景点编号来看看景点间有没道路 景点1的编号和景点2的编号(空格隔开):"); 9 fflush(stdin); /*消除前面回车的影响*/ 10 scanf("%d %d",&z,&x); 11 if(G->Arcs[z][x].metre>0 && G->Arcs[z][x].metre<INF) 12 { 13 printf(" %s到%s的道路信息:%s ",G->vex[z].MingCheng,G->vex[x].MingCheng,G->Arcs[z][x].LJinfo); 14 printf(" (^_^)/请输入新的道路信息:"); 15 fflush(stdin); /*消除前面回车的影响*/ 16 scanf("%s",c1); 17 strcpy(G->Arcs[z][x].LJinfo,c1); 18 printf(" %s到%s的道路信息已更新为:%s ",G->vex[z].MingCheng,G->vex[x].MingCheng,G->Arcs[z][x].LJinfo); 19 } 20 else 21 printf(" 查询失败(两个景点间没有直接线路,或者看看是不是输错数字了)-_-# "); 22 23 printf(" ————————————————————我只是条分割线,别看我(/ω\)—————————————————— "); 24 }
添加新景点
1 /*6增加新的景点*/ 2 void AddNewJD(SchoolMap *G){ 3 int i; 4 char c1[MAX]; 5 6 printf(" 目前已有的景点:"); 7 for(i=1;i<=G->Vexnum;i++) 8 printf("%s ",G->vex[i].MingCheng); 9 10 printf(" (^_^)/请输入新的景点名称:"); 11 fflush(stdin); /*消除前面回车的影响*/ 12 scanf("%s",c1); 13 14 for(i=1;i<=G->Vexnum;i++) 15 { 16 if(strcmp(G->vex[i].MingCheng,c1)==0) 17 { 18 printf(" 哎呀~已经有了这个景点了 ");break; 19 } 20 else 21 { 22 G->Vexnum++; /*景点数量加1*/ 23 G->vex[G->Vexnum].Num=G->Vexnum; /*新景点获得编号*/ 24 strcpy(G->vex[G->Vexnum].MingCheng,c1); /*新景点获得名字*/ 25 26 for(i=1;i<=G->Vexnum;i++) 27 { 28 G->Arcs[i][G->Vexnum].metre=INF; //新景点到其他景点的距离初始为无连接 29 G->Arcs[G->Vexnum][i].metre=INF; //其他景点到新景点的距离初始为无连接 30 } 31 G->Arcs[G->Vexnum][G->Vexnum].metre=0; //新景点自身距离为0 32 strcpy(G->vex[G->Vexnum].JDinfo,"这个人很帅,什么都没有写←_←"); /*添加默认简介*/ 33 34 printf(" 添加成功(^_^)/ 新的景点名称:%s",G->vex[G->Vexnum].MingCheng); 35 printf(" 目前已有的景点:"); 36 for(i=1;i<=G->Vexnum;i++) 37 printf("%s ",G->vex[i].MingCheng); 38 printf(" "); 39 break; 40 } 41 } 42 printf(" ————————————————————我只是条分割线,别看我(/ω\)—————————————————— "); 43 }
添加新道路
1 /*7增加新的道路*/ 2 void AddNewLJ(SchoolMap *G){ 3 int i,jl,z,x; 4 5 printf(" 目前已有的景点:"); 6 for(i=1;i<=G->Vexnum;i++) 7 printf("%d%s ",G->vex[i].Num,G->vex[i].MingCheng); /*虽然G->vex[i].Num和i一样没差啦,不过还是要看你的编号怎么排的*/ 8 9 printf(" (^_^)/请输入新道路的起止点(输入数字,空格隔开):"); 10 fflush(stdin); /*消除前面回车的影响*/ 11 scanf("%d %d",&z,&x); 12 13 if(G->Arcs[z][x].metre>0 && G->Arcs[z][x].metre<INF) 14 { 15 printf(" 哎呀~这两个景点间已经有一条路了,不用再修了(^○^) "); 16 } 17 else 18 { 19 if(z>G->Vexnum||x>G->Vexnum||z<1||x<1) 20 printf(" 哎呀~没有输入正确的景点编号呢,不能修路了啊T_T "); 21 else 22 { 23 printf(" 好,是新修的路呢 请输入这条路的长度(单位米):"); 24 fflush(stdin); /*消除前面回车的影响*/ 25 scanf("%d",&jl); /*获取距离*/ 26 if(jl<=0) 27 printf(" 输入有误哦,请检查一下吧"); 28 else 29 { 30 G->Arcs[z][x].metre=jl; /*更新距离*/ 31 G->Arcs[x][z].metre=jl; 32 strcpy(G->Arcs[z][x].LJinfo,"这个人很帅,什么都没有写←_←"); //初始化新加的道路的信息 33 strcpy(G->Arcs[x][z].LJinfo,"这个人很帅,什么都没有写←_←"); 34 G->Arcnum++; /*路线数量加1*/ 35 printf(" 操作成功! %s到%s间有一条新路了,距离%d米 ",G->vex[z].MingCheng,G->vex[x].MingCheng,G->Arcs[z][x].metre); 36 } 37 } 38 } 39 40 printf(" ————————————————————我只是条分割线,别看我(/ω\)—————————————————— "); 41 }
主函数
1 SchoolMap G; 2 jiantu(&G); 3 //建图,然后初始化录入信息,后面调用功能记得传图地址就行
删除和查询最短距离见第十篇