技术学习博9
第十六周結課了,所以都在復習
第十七周做實踐作業(yè),用賦權無向圖做個校園導游程序
這里放一下圖的定義、初始化、顯示矩陣、查詢、修改(更新)和添加函數(shù)
結構體定義
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; /*圖的景點數(shù)量和路線數(shù)量*/
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","∞"); //不想直接打數(shù)字,所以用無窮的符合來替換啦
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("
查詢失敗(兩個景點間沒有直接線路,或者看看是不是輸錯數(shù)字了)-_-#
");
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("
(^_^)/請選擇要更新的景點簡介(輸入數(shù)字):");
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("
查詢失敗(兩個景點間沒有直接線路,或者看看是不是輸錯數(shù)字了)-_-#
");
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++; /*景點數(shù)量加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("
(^_^)/請輸入新道路的起止點(輸入數(shù)字,空格隔開):");
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++; /*路線數(shù)量加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 }
主函數(shù)
1 SchoolMap G; 2 jiantu(&G); 3 //建圖,然后初始化錄入信息,后面調用功能記得傳圖地址就行
刪除和查詢最短距離見第十篇
總結
- 上一篇: 为何程序员上班时间总戴个耳机,看完恍然大
- 下一篇: 老工程师谈电子物料:别拿一分钱不当回事!