当前位置:
首页 >
技术学习博9
发布时间:2023/12/19
53
生活家
第十六周结课了,所以都在复习
第十七周做实践作业,用赋权无向图做个校园导游程序
这里放一下图的定义、初始化、显示矩阵、查询、修改(更新)和添加函数
结构体定义
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 //建图,然后初始化录入信息,后面调用功能记得传图地址就行
删除和查询最短距离见第十篇
总结
- 上一篇: 为何程序员上班时间总戴个耳机,看完恍然大
- 下一篇: 构建内部邮件服务器(DNS+sendma