欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

技术学习博9

发布时间:2023/12/19 53 生活家
生活随笔 收集整理的这篇文章主要介绍了 技术学习博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     //建图,然后初始化录入信息,后面调用功能记得传图地址就行

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

总结

以上是生活随笔为你收集整理的技术学习博9的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。