第十七周
补校园导游程序实践的删除和查询最短距离功能
删除景点
1 /*8删除景点*/ 2 void DelJD(SchoolMap *G){ 3 int i,j,dd,jishu=0; 4 5 printf(" 目前已有的景点:"); 6 for(i=1;i<=G->Vexnum;i++) 7 printf("%d%s ",i,G->vex[i].MingCheng); 8 9 printf(" 请选择要删除的景点(数字编号):"); 10 fflush(stdin); /*消除前面回车的影响*/ 11 scanf("%d",&dd); 12 13 if(dd>G->Vexnum||dd<1) 14 printf(" 输入有误哦,请仔细检查一下吧~+_+"); 15 else 16 { 17 for(j=1;j<=G->Vexnum;j++) 18 if(G->Arcs[j][dd].metre>0 && G->Arcs[j][dd].metre<INF) jishu++; //计算减少的道路数量 19 for(i=dd;i<G->Vexnum;i++) /*后面景点的信息前移,注意这里就循环到倒二*/ 20 { 21 G->vex[i].Num=G->vex[i+1].Num; /*景点编号前移,虽然这个编号基本没去用,但是还是挪一下吧*/ 22 strcpy(G->vex[i].MingCheng,G->vex[i+1].MingCheng); /*景点名称前移*/ 23 strcpy(G->vex[i].JDinfo,G->vex[i+1].JDinfo); /*景点信息前移*/ 24 25 /*道路和信息的改动*/ 26 for(j=1;j<=G->Vexnum;j++) //这里有等号,要走满 27 { 28 G->Arcs[j][i].metre=G->Arcs[j][i+1].metre; //阵列左移 29 strcpy(G->Arcs[j][i].LJinfo,G->Arcs[j][i+1].LJinfo);//路径信息左移 30 } 31 for(j=1;j<=G->Vexnum;j++) //这里有等号,要走满 //虽然两个循环外层条件一样,但是不能写在一个循环里,同时移动会造成数据错乱 32 { 33 G->Arcs[i][j].metre=G->Arcs[i+1][j].metre; //阵列上移 34 strcpy(G->Arcs[i][j].LJinfo,G->Arcs[i+1][j].LJinfo);//路径信息上移 35 } 36 } 37 38 G->Vexnum--; //景点数量减1 39 G->Arcnum=G->Arcnum-jishu; //道路相应减少 40 printf(" 删除成功(^o^) "); 41 printf(" 这是删除后目前的景点:"); 42 for(i=1;i<=G->Vexnum;i++) 43 printf("%d%s ",i,G->vex[i].MingCheng); 44 printf(" 然后道路减少了%d条,还剩下%d条路线(^○^)",jishu,G->Arcnum); 45 } 46 printf(" ————————————————————我只是条分割线,别看我(/ω\)—————————————————— "); 47 }
删除道路就少很多了
1 /*9删除道路*/ 2 void DelLJ(SchoolMap *G){ 3 int i,z,x; 4 printf(" 目前有%d条路线 以及目前已有的景点:",G->Arcnum); 5 for(i=1;i<=G->Vexnum;i++) 6 printf("%d%s ",G->vex[i].Num,G->vex[i].MingCheng); 7 printf(" 请输入起止景点的编号来删除道路(空格隔开):"); 8 fflush(stdin); /*消除前面回车的影响*/ 9 scanf("%d %d",&z,&x); 10 if(G->Arcs[z][x].metre==INF) 11 printf(" 两个景点间没有路呀,不用删了哈~(°_°) "); 12 else 13 { 14 G->Arcs[z][x].metre=INF; //道路距离重置为无穷表示没有连接 15 G->Arcs[x][z].metre=INF; 16 strcpy(G->Arcs[z][x].LJinfo,""); //道路信息重置为空 17 strcpy(G->Arcs[x][z].LJinfo,""); //道路信息重置为空 18 G->Arcnum--; //总道路数量减1 19 printf(" (^_^)/删除成功~还剩下%d条道路",G->Arcnum); 20 } 21 printf(" ————————————————————我只是条分割线,别看我(/ω\)—————————————————— "); 22 }
查询最短距离,这里用的是迪杰斯特拉算法
1 /*10查询最短距离*/ 2 void ChaZuiduanLJ(SchoolMap *G){ 3 int z,x,i,j,k,min,tmp; 4 int flag[MAX]; //flag数组表示是否获取了最短路径 5 int prev[MAX]; //prev数组表示前驱顶点是否获取了 6 int dist[MAX]; //dist数组表示顶点的最短路径为“起点”到“顶点i”的权 7 8 printf(" 目前已有的景点:"); 9 for(i=1;i<=G->Vexnum;i++) 10 printf("%d%s ",G->vex[i].Num,G->vex[i].MingCheng); 11 printf(" 请输入起点和终点的数字编号来查询最短距离(空格隔开):"); 12 fflush(stdin); /*消除前面回车的影响*/ 13 scanf("%d %d",&z,&x); 14 15 if(z<1||z>G->Vexnum||x<1||x>G->Vexnum) 16 printf(" 输入有误哦~+_+"); 17 else 18 { 19 //迪杰斯特拉算法查询 20 //初始化 21 for(i=1;i<=G->Vexnum;i++) 22 { 23 flag[i]=0; //顶点i的最短路径还没获取到 24 prev[i]=0; //顶点i的前驱顶点为0 25 dist[i]=G->Arcs[z][i].metre;//顶点i的最短路径为“起点z”到“顶点i”的权 26 } 27 //对“起点z”自身进行初始化 28 flag[z]=1; 29 dist[z]=0; 30 //遍历总顶点数-1次,每次找出一个顶点的最短路径 31 for(i=2;i<=G->Vexnum;i++) 32 { 33 //寻找当前最小的路径 34 //即,在未获取最短路径的顶点中,找到离z最近的顶点(k) 35 min=INF; 36 for(j=1;j<=G->Vexnum;j++) 37 { 38 if(flag[j]==0 && dist[j]<min) 39 { 40 min=dist[j]; 41 k=j; 42 } 43 } 44 //标记“顶点k”为已经获取到最短路径 45 flag[k]=1; 46 47 //修正当前最短路径和前驱顶点 48 //即,当已经获取到“顶点k的最短路径”之后,更新“未获取最短路径的顶点的最短路径和前驱顶点” 49 for(j=1;j<=G->Vexnum;j++) 50 { 51 tmp=(G->Arcs[k][j].metre==INF ? INF :(min+G->Arcs[k][j].metre));//防止溢出 52 if(flag[j]==0 && (tmp<dist[j])) 53 { 54 dist[j]=tmp; 55 prev[j]=k; 56 } 57 } 58 } 59 //打印查询后的结果 60 if(dist[x]==INF) 61 printf(" 当前位置去%s的路还没修好,去不了呢+_+",G->vex[x].MingCheng); 62 else 63 printf(" %s到%s的距离有%d米",G->vex[z].MingCheng,G->vex[x].MingCheng,dist[x]); 64 } 65 printf(" ————————————————————我只是条分割线,别看我(/ω\)—————————————————— "); 66 }
校园导游程序实践的代码就展示到这(ミ´ω`ミ)