技术学习博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("\n\t    ");
 5     for(i=1;i<=G->Vexnum;i++)
 6         printf("%-10s",G->vex[i].MingCheng);            /*第一行名称,%-10s为了排版好看,下同*/
 7     
 8     printf("\n");
 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("\n");
20     }
21 
22     printf("\n————————————————————我只是条分割线,别看我(/ω\)——————————————————\n\n");
23 }

查询景点简介

 1 /*2查询景点的简介*/
 2 void ChaXunJDjianjie(SchoolMap *G){
 3     int i,kkr;
 4 
 5     printf("\n\t\t");
 6     for(i=1;i<=G->Vexnum;i++)
 7         printf("%d%s ",i,G->vex[i].MingCheng);
 8     printf("\n\t\t\t(^_^)/请输入景点编号来查询景点的简介:");
 9     scanf("%d",&kkr);
10     
11     if(kkr==G->vex[kkr].Num)
12     {
13         printf("\n\t\t\t%s的简介为:%s",G->vex[kkr].MingCheng,G->vex[kkr].JDinfo);
14     }
15     else printf("\n\t\t\t查询失败(看看是不是输错了)-_-# \n");
16 
17     printf("\n————————————————————我只是条分割线,别看我(/ω\)——————————————————\n\n");
18 }

查询景点间的道路

 1 /*3查询景点间的道路*/
 2 void ChaXunJDdaolu(SchoolMap *G){
 3     int i,z=0,x=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     printf("\n\n\t\t\t(^_^)/请输入起止景点编号来查询景点间的道路\n\n\t\t\t景点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("\n\t\t\t%s到%s的道路信息:%s\n",G->vex[z].MingCheng,G->vex[x].MingCheng,G->Arcs[z][x].LJinfo);
13     else
14         printf("\n\t\t\t查询失败(两个景点间没有直接线路,或者看看是不是输错数字了)-_-# \n");
15 
16     printf("\n————————————————————我只是条分割线,别看我(/ω\)——————————————————\n\n");
17 }

更新(修改)景点简介

 1 /*4更新景点简介*/
 2 void UpdateJDinfo(SchoolMap *G){
 3     int i,kkr;
 4     char c1[MAX];
 5     printf("\n\t\t");
 6     for(i=1;i<=G->Vexnum;i++)
 7         printf("%d%s ",i,G->vex[i].MingCheng);
 8     printf("\n\t\t\t(^_^)/请选择要更新的景点简介(输入数字):");
 9     scanf("%d",&kkr);
10     
11     if(kkr==G->vex[kkr].Num)
12     {
13         printf("\n\t\t\t%s的简介为:%s\n\n\t\t\t(^_^)/请输入新的景点简介:",G->vex[kkr].MingCheng,G->vex[kkr].JDinfo);
14         fflush(stdin);    /*消除前面回车的影响*/
15         scanf("%s",c1);
16         strcpy(G->vex[kkr].JDinfo,c1);
17         printf("\n\t\t\t%s的简介已更新为:%s\n",G->vex[kkr].MingCheng,G->vex[kkr].JDinfo);
18     }
19     else printf("\n\t\t\t咦~!没有找到这个景点呢,看看是不是输错了-_-#\n");
20 
21     printf("\n————————————————————我只是条分割线,别看我——————————————————\n\n");
22 }

更新(修改)道路信息

 1 /*5更新道路信息*/
 2 void UpdateLJinfo(SchoolMap *G){
 3     int i,z=0,x=0,pd=0;
 4     char c1[MAX];
 5     printf("\n\t\t");
 6     for(i=1;i<=G->Vexnum;i++)
 7         printf("%d%s ",i,G->vex[i].MingCheng);
 8     printf("\n\n\t\t\t(^_^)/请输入起止景点编号来看看景点间有没道路\n\n\t\t\t景点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("\n\t\t\t%s到%s的道路信息:%s\n",G->vex[z].MingCheng,G->vex[x].MingCheng,G->Arcs[z][x].LJinfo);
14         printf("\n\t\t\t(^_^)/请输入新的道路信息:");
15         fflush(stdin);    /*消除前面回车的影响*/
16         scanf("%s",c1);
17         strcpy(G->Arcs[z][x].LJinfo,c1);
18         printf("\n\t\t\t%s到%s的道路信息已更新为:%s\n",G->vex[z].MingCheng,G->vex[x].MingCheng,G->Arcs[z][x].LJinfo);
19     }
20     else
21         printf("\n\t\t\t查询失败(两个景点间没有直接线路,或者看看是不是输错数字了)-_-# \n");
22 
23     printf("\n————————————————————我只是条分割线,别看我(/ω\)——————————————————\n\n");
24 }

添加新景点

 1 /*6增加新的景点*/
 2 void AddNewJD(SchoolMap *G){
 3     int i;
 4     char c1[MAX];
 5 
 6     printf("\n\t\t目前已有的景点:");
 7     for(i=1;i<=G->Vexnum;i++)
 8         printf("%s ",G->vex[i].MingCheng);
 9     
10     printf("\n\t\t\t(^_^)/请输入新的景点名称:");
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("\n\t\t\t哎呀~已经有了这个景点了\n");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("\n\t\t\t添加成功(^_^)/\n\n\t\t\t新的景点名称:%s",G->vex[G->Vexnum].MingCheng);
35             printf("\n\n\t\t目前已有的景点:");
36             for(i=1;i<=G->Vexnum;i++)
37                 printf("%s ",G->vex[i].MingCheng);
38             printf("\n");
39             break;
40         }
41     }
42     printf("\n————————————————————我只是条分割线,别看我(/ω\)——————————————————\n\n");
43 }

添加新道路

 1 /*7增加新的道路*/
 2 void AddNewLJ(SchoolMap *G){
 3     int i,jl,z,x;
 4 
 5     printf("\n\t\t目前已有的景点:");
 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("\n\t\t\t(^_^)/请输入新道路的起止点(输入数字,空格隔开):");
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("\n\t\t\t哎呀~这两个景点间已经有一条路了,不用再修了(^○^)\n");
16     }
17     else
18     {
19         if(z>G->Vexnum||x>G->Vexnum||z<1||x<1)
20             printf("\n\t\t\t哎呀~没有输入正确的景点编号呢,不能修路了啊T_T\n");
21         else
22         {
23             printf("\n\t\t\t好,是新修的路呢\n\t\t\t请输入这条路的长度(单位米):");
24             fflush(stdin);        /*消除前面回车的影响*/
25             scanf("%d",&jl);    /*获取距离*/
26             if(jl<=0)
27                 printf("\n\t\t\t输入有误哦,请检查一下吧");
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("\n\t\t\t操作成功!\n\t\t\t%s到%s间有一条新路了,距离%d米\n",G->vex[z].MingCheng,G->vex[x].MingCheng,G->Arcs[z][x].metre);
36             }
37         }
38     }
39 
40     printf("\n————————————————————我只是条分割线,别看我(/ω\)——————————————————\n\n");
41 }

主函数

1     SchoolMap G;        
2     jiantu(&G);
3     //建图,然后初始化录入信息,后面调用功能记得传图地址就行

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

猜你喜欢

转载自www.cnblogs.com/hhw-/p/13201058.html
今日推荐