数据结构 课程设计报告 :校园导航系统
完整代碼及文檔已上傳https://download.csdn.net/download/qq_45772158/12615918
一 . 設計目的
隨著高校的發展,校園面積不斷擴大,校園內跨區域活動頻繁,為了給校內師生和校外人士辦公、教學、生活等方面帶來更大的便利,以及面對校園信息化建設的全面推廣和迅猛發展,本系統,將通過迪杰斯特拉和弗洛伊德算法,求出所需最短路徑,進一步加強數字化校園建設。
二 . 設計內容和要求
圖的最短路徑問題是指從指定的某一點v開始,求得從該地點到圖中其它各地點的最短路徑。并且給出求得的最短路徑的長度及途徑的地點。
設計學校的平面圖,至少包括10個以上的場所,每兩個場所間可以有不同的路,且路長也可能不同,找出從任意場所到達另一場所最短路徑(即用迪杰斯特拉算法),以及從任意場所到達所有場所的最短路徑(即用弗洛伊德算法)。 功能要求:
(1)輸出頂點信息:將校園內各景點輸出。
(2)輸出邊的信息:將校園內每兩個位置(若兩個位置之間有直接路徑)的距離輸出。
(3)修改:修改兩個位置(若兩個位置之間有直接路徑)的距離,并重新輸出每兩個位置(若兩個位置之間有直接路徑)的距離;
(4)求最短路徑:輸出給定兩點之間的最短路徑的長度及途經的地點,輸出任意一點與其他各點的最短路徑。
三 . 校園導航系統模塊圖
//迪杰斯特拉算法流程圖
//弗洛伊德算法流程圖
四、編碼實現
1.結點結構體
typedef struct
{
char name[30]; //結點名稱int num; //結點編號
}VEXTYPE;
typedef struct
{
VEXTYPE vexs[LENGTH];//結點value arcs[LENGTH][LENGTH];//弧
int vexnum,arcnum ;//結點數和最大路徑
}MGraph;//鄰接矩陣
2.輸出學校內各地點
void PutOutVex(MGraph *G) // 功能 1 輸出學校內各地點
{
for(int i=0;ivexnum;i++) cout<vexs[i].name<<" " <<endl;
}
利用for循環,將數組中的數據輸出
3.輸出每兩個直接相連地點的距離
void PutOutArc(MGraph *G) // 功能 2 輸出每兩個直接相連地點的距離
{
for(int i=0;ivexnum;i++)
for(int j=0;jvexnum;j++) if(G->arcs[i][j]<MAX)
{
cout <vexs[i].name<<"------>"<vexs[j].name<<" 的距離為 " <arcs[i][j]<<endl;
}
}
利用兩個for循環,將數據輸出。利用MAX,可將不相鄰頂點設置為距離無窮大 。
4.修改兩個地址距離
void Change(MGraph *G) // 功能 3 修改:修改兩個地址距離
{
int v0,v1,length;
cout<<" 修改:請輸入起始頂點 :\n"; cin>>v0;
if(v0<0||v0>G->vexnum)
{
cout<<" 此點不存在 ! 請重新輸入頂點 :"; cin>>v0;
}
cout<<" 請輸入結束頂點 :\n"; cin>>v1;
if(v1<0||v1>G->vexnum)
{
cout<<" 此點不存在 ! 請重新輸入頂點 :"; cin>>v1;
}
cout<<" 輸入距離 :"; cin>>length;
G->arcs[v0][v1]=G->arcs[v1][v0]=length;
}
利用if語句,判斷輸入結點位置是否符合要求,同時保存兩結點雙向位置
5.使用 Dijkstra 算法求解最短路徑
void Dijkstra(MGraph * G) // 功能 4. 求最短路徑 輸出兩地點之間最短路徑 使用 Dijkstra 算法求解最短路徑
{
int v,w,i,min,t=0,x,v0,v1;
int final[20], D[20], p[20][20]; cout<<" 請輸入起始頂點 :\n"; cin>>v0;
if(v0<0||v0>G->vexnum)
{
cout<<" 此點不存在 ! 請重新輸入頂點 :"; cin>>v0;
}
cout<<" 請輸入結束頂點 :\n"; cin>>v1;
if(v1<0||v1>G->vexnum)
{
cout<<" 此點不存在 ! 請重新輸入頂點 :"; cin>>v1;
}
for(v=0;vvexnum;v++)
{
final[v]=0;
D[v]=G->arcs[v0][v]; for(w=0;wvexnum;w++) p[v][w]=0;
if(D[v]<MAX)
{
p[v][v0]=1;p[v][v]=1;
}
}
D[v0]=0;final[v0]=1; for(i=1;ivexnum;i++)
{
min=MAX;
for(w=0;wvexnum;w++) if(!final[w]) if(D[w]<min){v=w;min=D[w];} final[v]=1;
for(w=0;wvexnum;w++) if(!final[w]&&(min+G->arcs[v][w]<D[w]))
{
D[w]=min+G->arcs[v][w]; for(x=0;xvexnum;x++)
p[w][x]=p[v][x]; p[w][w]=1;
}
}
cout<<" 從 “<vexs[v0].name<<” 到 “<vexs[v1].name<<” 的最短路徑長度為 :
“<<D[v1]<<endl;
cout<<” 途經的景點 : "<<endl; for(int j=0;jvexnum;j++)
{
if(p[v1][j]==1)
cout<vexs[j].name<<endl;
}
}
(1)初始化:先找處從源點V0到各終點V1的直達路徑(V0,V1),即通過一條弧到達的路 徑。
(2)選擇:從這些路徑中找出一條長度最短的路徑(V0,x)。
(3)更新:然后對其余各條路徑進行適當的調整:
若在圖中存在弧(x,V1),且(x,V1)+(V0,x)<(V0,V1),則以路徑(V0,x,V1)代替
(V0,V1)。
(4)在調整后的各條路徑中,再找長度最短的路徑,以此類推。
五、實驗結果與分析
1.頁面展示
2.輸出學校內各地點
3.輸出每兩個直接相連地點的距離
4.修改兩個地點距離
(當輸入的頂點不符合要求時)
5.兩地點之間最短路徑
校門–>13公寓 20
13公寓–>操場 70
操場–>大活 70
大活–>籃球場 70 20+70*3=230
六、總結
本次課設對于我本人來說還是有些難度,編寫過程遇到了很多問題,算法功能也有不足之處,尤其是在輸出最短路徑輸出時總是輸出空白。通過詢問老師與同學,解決了這些問題。通過本次課程設 計,鍛煉了自己的耐心,確實有些問題很難修改,但改出來很有成就感,希望后面加以總結,并繼續學習下去。
總結
以上是生活随笔為你收集整理的数据结构 课程设计报告 :校园导航系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 工作138:git使用
- 下一篇: 前端学习(2812):前端小程序学习之小