技术学习博10

第十七周

补校园导游程序实践的删除和查询最短距离功能

删除景点

 1 /*8删除景点*/
 2 void DelJD(SchoolMap *G){
 3     int i,j,dd,jishu=0;
 4 
 5     printf("\n\t\t目前已有的景点:");
 6     for(i=1;i<=G->Vexnum;i++)
 7         printf("%d%s ",i,G->vex[i].MingCheng);
 8 
 9     printf("\n\t\t请选择要删除的景点(数字编号):");
10     fflush(stdin);        /*消除前面回车的影响*/
11     scanf("%d",&dd);
12 
13     if(dd>G->Vexnum||dd<1)
14         printf("\n\t\t输入有误哦,请仔细检查一下吧~+_+");
15     else
16     {
17         for(j=1;j<=G->Vexnum;j++)
18             if(G->Arcs[j][dd].metre>0 && G->Arcs[j][dd].metre//计算减少的道路数量
19         for(i=dd;iVexnum;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("\n\t\t删除成功(^o^) ");
41         printf("\n\t\t这是删除后目前的景点:");
42         for(i=1;i<=G->Vexnum;i++)
43             printf("%d%s ",i,G->vex[i].MingCheng);
44         printf("\n\t\t然后道路减少了%d条,还剩下%d条路线(^○^)",jishu,G->Arcnum);
45     }
46     printf("\n————————————————————我只是条分割线,别看我(/ω\)——————————————————\n\n");
47 }

删除道路就少很多了

 1 /*9删除道路*/
 2 void DelLJ(SchoolMap *G){
 3     int i,z,x;
 4     printf("\n\t\t目前有%d条路线\n\t\t以及目前已有的景点:",G->Arcnum);
 5     for(i=1;i<=G->Vexnum;i++)
 6         printf("%d%s ",G->vex[i].Num,G->vex[i].MingCheng);
 7     printf("\n\n\t\t请输入起止景点的编号来删除道路(空格隔开):");
 8     fflush(stdin);        /*消除前面回车的影响*/
 9     scanf("%d %d",&z,&x);
10     if(G->Arcs[z][x].metre==INF)
11         printf("\n\t\t两个景点间没有路呀,不用删了哈~(°_°) ");
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("\n\t\t(^_^)/删除成功~还剩下%d条道路",G->Arcnum);
20     }
21     printf("\n————————————————————我只是条分割线,别看我(/ω\)——————————————————\n\n");
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("\n\t\t目前已有的景点:");
 9     for(i=1;i<=G->Vexnum;i++)
10         printf("%d%s ",G->vex[i].Num,G->vex[i].MingCheng);
11     printf("\n\t\t请输入起点和终点的数字编号来查询最短距离(空格隔开):");
12     fflush(stdin);        /*消除前面回车的影响*/
13     scanf("%d %d",&z,&x);
14 
15     if(z<1||z>G->Vexnum||x<1||x>G->Vexnum)
16         printf("\n\t\t输入有误哦~+_+");
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("\n\t\t当前位置去%s的路还没修好,去不了呢+_+",G->vex[x].MingCheng);
62         else
63             printf("\n\t\t%s到%s的距离有%d米",G->vex[z].MingCheng,G->vex[x].MingCheng,dist[x]);
64     }
65     printf("\n————————————————————我只是条分割线,别看我(/ω\)——————————————————\n\n");
66 }

校园导游程序实践的代码就展示到这(ミ´ω`ミ)

 

你可能感兴趣的:(技术学习博10)