zoukankan      html  css  js  c++  java
  • 技术学习博10

    第十七周

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

    删除景点

     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 }

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

  • 相关阅读:
    第一周博客作业(学习历程和感想)
    WordCount 基础功能
    MyBatis 分页插件 PageHelper 使用
    手机尾号猜年龄骗局解密
    逻辑思维题一
    给div添加滚动条
    my97中文乱码问题
    cookie中文乱码
    多线程下的单例模式
    HTML5的入门与深入理解
  • 原文地址:https://www.cnblogs.com/hhw-/p/13201073.html
Copyright © 2011-2022 走看看