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

    第十六周结课了,所以都在复习

    第十七周做实践作业,用赋权无向图做个校园导游程序

    这里放一下图的定义、初始化、显示矩阵、查询、修改(更新)和添加函数

    结构体定义

     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     //建图,然后初始化录入信息,后面调用功能记得传图地址就行

    删除和查询最短距离见第十篇

  • 相关阅读:
    STL的二分查找binary_search
    转_HDU_1907&2509 博弈(Nim博弈变形)
    HDU3589_Jacobi symbol_二次剩余
    转载_模运算_归纳得很精华啊
    HDU3501_calculation2_欧拉函数求和
    【转】求小于等于N的与N互质的数的和
    HDU3328_Flipper_纸牌翻转_模拟题
    转_求逆元的两种方法
    HDU2541_Simple Addition Expression
    MySql数据同步(双机热备)已正式应用上平台
  • 原文地址:https://www.cnblogs.com/hhw-/p/13201058.html
Copyright © 2011-2022 走看看