《校園導(dǎo)游咨詢系統(tǒng)》數(shù)據(jù)結(jié)構(gòu)課程設(shè)計說明書_第1頁
《校園導(dǎo)游咨詢系統(tǒng)》數(shù)據(jù)結(jié)構(gòu)課程設(shè)計說明書_第2頁
《校園導(dǎo)游咨詢系統(tǒng)》數(shù)據(jù)結(jié)構(gòu)課程設(shè)計說明書_第3頁
《校園導(dǎo)游咨詢系統(tǒng)》數(shù)據(jù)結(jié)構(gòu)課程設(shè)計說明書_第4頁
《校園導(dǎo)游咨詢系統(tǒng)》數(shù)據(jù)結(jié)構(gòu)課程設(shè)計說明書_第5頁
已閱讀5頁,還剩41頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、中北大學(xué)數(shù)據(jù)結(jié)構(gòu)課程設(shè)計說明書學(xué)生姓名:劉安光學(xué)號:1507084143學(xué)生姓名:劉晨馨學(xué)號:1507084103學(xué)生姓名:占文慧學(xué)號:1507084118學(xué)生姓名:周順帆學(xué)號:1507084114學(xué)院:計算機與控制工程學(xué)院專 業(yè):網(wǎng)絡(luò)工程專業(yè)題 目:校園導(dǎo)游咨詢系統(tǒng)指導(dǎo)教師梁志劍、張建華2016年12月30日目錄1 .設(shè)計目的1.2 .設(shè)計內(nèi)容1.3 .設(shè)計要求1.4 .模塊分工1.5 .數(shù)據(jù)結(jié)構(gòu)2.6 .詳細設(shè)計3.6.1 主函數(shù)模塊 詳細設(shè)計思想 核心代碼4.6.2 圖的建立模塊 詳細設(shè)計思想 核心代碼5.6.3 信息查詢模塊6.

2、6.3.1 詳細設(shè)計思想 核心代碼7.6.4 兩景點最短路徑模塊 詳細設(shè)計思想 核心代碼1.06.5 多景點最佳路徑模塊 126.5.1 詳細設(shè)計思想 126.5.2 核心代碼1.26.6 求圖的關(guān)節(jié)點模塊136.6.1 詳細設(shè)計思想 136.6.2 核心代碼1.56.7 兩景點所有路徑模塊 176.7.1 詳細設(shè)計思想 176.7.2 核心代碼1.86.8 游客及管理員菜單模塊 詳細設(shè)計思想196.8.2 核心代碼207 .源碼文件257.1 源碼257.2 文本文件307.2.1 map.txt307.2.2 liuyan.txt

3、318 .運行截圖328.1 主菜單界面與功能一覽.328.2 中北校園景點信息查詢.328.3 兩景點間最短路徑查詢.328.4 兩景點間所有路徑查詢 .338.5 多景點間訪問路線查詢.338.6 輸出校園景點圖關(guān)節(jié)點.338.7 公告查看及游客留言欄 .348.8 景點管理員后臺管理欄.358.9 退出校園導(dǎo)游咨詢系統(tǒng).369 .經(jīng)驗總結(jié)379.1 關(guān)于分工379.2 關(guān)于答辯371 .設(shè)計目的數(shù)據(jù)結(jié)構(gòu)課程主要介紹最常用的數(shù)據(jù)結(jié)構(gòu),闡明各種數(shù)據(jù)結(jié)構(gòu)內(nèi)在的邏輯關(guān)系,討論其在計算機中的存儲表示,以及在其上進行各種運算時的實現(xiàn)算法,并對算法的效率進行簡單的分析和討論。進行數(shù)據(jù)結(jié)構(gòu)課程設(shè)計要達到

4、以下目的:(1) 了解并掌握數(shù)據(jù)結(jié)構(gòu)與算法的設(shè)計方法,具備初步的獨立分析和設(shè)計能力;(2)初步掌握軟件開發(fā)過程的問題分析、系統(tǒng)設(shè)計、程序編碼、測試等基本方法和技能;(3)提高綜合運用所學(xué)的理論知識和方法獨立分析和解決問題的能力;訓(xùn)練用系統(tǒng)的觀點和軟件開發(fā)一般規(guī)范進行軟件開發(fā),培養(yǎng)軟件工作者所應(yīng)具備的科學(xué)的工作方法和作風(fēng)。2 .設(shè)計內(nèi)容設(shè)計一個校園導(dǎo)游程序,為來訪的客人提供各種信息查詢服務(wù)。(1)設(shè)計中北大學(xué)的校園平面圖, 所含景點不少于10個,以圖中頂點表示校內(nèi)各景點,存放景點名稱、代號、簡介等信息;以邊表示路徑,存放路徑長度等相關(guān)信息。(2)為來訪客人提供圖中任意景點相關(guān)信息的查詢。(3)為

5、來訪客人提供圖中任意景點的問路查詢,即查詢?nèi)我鈨上嗑包c之間的一條最短的簡單路徑。(4)求校園圖的關(guān)節(jié)點。(5)提供圖中任意景點問路查詢,即求任意兩個景點之間的所有路徑。(6)提供校園圖中多個景點的最佳訪問路線查詢,即求途經(jīng)這多個景點的最佳路徑。3 .設(shè)計要求(1)符合課題要求,實現(xiàn)相應(yīng)功能;(2)要求界面友好美觀,操作方便易行;(3)注意程序的實用性、安全性;4 .模塊分工劉安光:主函數(shù)模塊、求圖的關(guān)節(jié)點模、兩景點所有路徑模塊。劉晨馨:兩景點最短路徑模塊、多景點最佳路徑模塊。古文慧:游客菜單模塊、管理員菜單模塊。周順帆:圖的建立及輸出模塊、信息查詢模塊。5 .數(shù)據(jù)結(jié)構(gòu)該程序用到的是圖的數(shù)據(jù)結(jié)構(gòu)

6、,其中用到的是圖的鄰接矩陣存儲結(jié)構(gòu)。#define INFINITY 9999 /*#define M 20typedef struct /*int num; /*char name20;char intro200;/*vertexType;/*typedef int edgeType; /*typedef struct /*vertexType vexsM; /*edgeType edgsMM; /*此處用9999代表無窮大*/*最大頂點數(shù)*/景點信息結(jié)構(gòu)定義*/景點代號*/*景點名稱*/景點簡介*/鄰接矩陣頂點結(jié)構(gòu)*/權(quán)值類型*/校園景點圖結(jié)構(gòu)體定義*/頂點值類型*/邊權(quán)值類型-距離*/i

7、nt vexNum, edgNum;/*圖頂點總數(shù)與邊數(shù) */mgraphType;/*鄰接矩陣結(jié)構(gòu)*/*函數(shù)一覽表*/void main();int Menu();void Creat_Map(mgraphType *g);/*void Dis_Map();/*void Admin_Menu(mgraphType *g);/*void Tour_Menu(mgraphType *g);/*int Judeg_Innum(int num);void Search_Intro(mgraphType *g);/*void ShortestPath_FLD(mgraphType *g); /*voi

8、d Floyd_Print(mgraphType,int,int); /*/*主函數(shù)*/*主菜單*/從文件讀取信息建立圖*/顯示校園景點地圖*/管理員菜單*/游客菜單*/*判斷輸入的編號是否合理*/景點信息查詢*/弗洛伊德算法求景點間最短的路徑*/遞歸實現(xiàn)打印兩點間的最短路徑 */void ShortestPath_Print(mgraphType); /*輸出并打印兩點間的最短路徑*/void Dfs_Allpath(mgraphType,int,int); /* void Allpath_Print(mgraphType *g);/*void Bestpath_Multispot(mgra

9、phType);void Dfs_Coila(mgraphType *g, int i); /*void Coila_Query(mgraphType *g);void System_Exit(int *quit);深度優(yōu)先遍歷查詢兩景點間所有路徑*/查詢兩景點之間的所有路徑并打印*/*多景點間求最佳路徑*/深度遍歷找關(guān)節(jié)點*/*求校園交通圖關(guān)節(jié)點*/*退出系統(tǒng)函數(shù)*/6 .詳細設(shè)計6.1主函數(shù)模塊6.1.1詳細設(shè)計思想開始*清屏,顯示地圖,中北校園景點信息查詢>清屏,顯示地圖,兩景點間最短路徑查詢*清屏,顯示地圖,兩景點間所有路徑查詢M清屏,顯示地圖,多景點間訪問路線查詢*清屏,顯示地

10、圖,輸出校園景點圖關(guān)節(jié)點>>清屏,顯示地圖,公告查看及游客留言欄清屏,顯示地圖,景點管理員后臺管理欄清屏,退出校園導(dǎo)游咨詢系統(tǒng)*按錯選項反饋錯誤信息圖1主函數(shù)模塊從文件讀取信息建立圖*/求 dist 與 path*/系統(tǒng)退出條件滿足判定*/*打印主菜單等待輸入項*/中北校園景點信息查詢*/*兩景點間最短路徑查詢*/兩景點間所有路徑查詢*/多景點間訪問路線查詢*/ 輸出校園景點圖關(guān)節(jié)點*/*公告查看及游客留言欄*/*景點管理員后臺管理欄*/*退出校園導(dǎo)游咨詢系統(tǒng)*/");/*按錯選項反饋錯誤信息*/6.1.2核心代碼/*主函數(shù)*/void main()int quit=0;

11、mgraphType g;Creat_Map(&g);/*ShortestPath_FLD(&g);/*floyedwhile(!quit)/*switch(menu()case 1: Dis_Map();Search_Intro(&g);break; /*case 2: Dis_Map();ShortestPath_Print(&g); break;case 3: Dis_Map();Allpath_Print(&g); break; /*case 4: Dis_Map();Bestpath_Multispot(&g);break; /*cas

12、e 5: Dis_Map();Coila_Query(&g);break; /*case 6: Dis_Map();Tour_Menu(&g);break;case 7: Dis_Map();Admin_Menu(&g);break;case 8: System_Exit(&quit);break;default:printf(" 錯誤!沒有該選項對應(yīng)的操作。system("pause");system("cls");6.2 圖的建立模塊6.2.1 詳細設(shè)計思想當(dāng)建立圖存儲結(jié)構(gòu)時,圖的信息以三元組( i , j

13、, w)的形式輸入,i、j分別表示兩頂 點的序號,w表示邊權(quán)。圖的頂點信息則時按照編號、名字、簡介的方式的方式在文件中存 儲。先初始化鄰接矩陣, 然后打開文件,若文件不為空則先讀入頂點數(shù)與邊數(shù)信息,然后按 文件中所給信息初始化鄰接矩陣的每個頂點,處理完定點后,把文件中的邊權(quán)信息讀入到鄰將無向圖的頂點接矩陣中建立無向圖,最后關(guān)閉文件,以待稍后輸出。如果文件不能打開,賦值為零。具體流程如下圖(圖2圖的建立)所示。圖2圖的建立6.2.2 核心代碼/*校園景點圖的讀取與創(chuàng)建*/void Creat_Map(mgraphType *g) /*從文件讀取圖的信息并建立圖*/int i, j, k, e;F

14、ILE *rf;/*rf = fopen("map.txt","r"); /*定義帶緩沖的文件指針*/從文件讀取圖的邊信息*/初始化領(lǐng)接矩陣*/到本點的距離為0其余不可達*/讀入圖的邊權(quán),建立無向圖 */文件以三元組形式存儲圖信息*/建立無向圖*/關(guān)閉文件*/if(rf)/*讀入圖的頂點數(shù)和邊數(shù)*/fscanf(rf,"%d%d",&g->vexNum, &g->edgNum);/*讀入圖的頂點數(shù)與邊數(shù) */for(i=0; i<g->vexNum; i+)/*讀入圖的頂點信息 */fscanf

15、(rf,"%d%s%s",&g->vexsi.num,g->,g->ro);for(i=0; i<g->vexNum; i+)/*for(j=0; j<g->vexNum; j+)if(i=j) g->edgsij=0; /*else g->edgsij=INFINITY;for(k=0; k<g->edgNum; k+)/*fscanf(rf,"%d%d%d",&i,&j,&e); /*g->edgsij=g-&

16、gt;edgs皿i=e; /*fclose(rf);/*else g->edgNum=0;6.3 信息查詢模塊6.3.1 詳細設(shè)計思想信息查詢?yōu)楸境绦蚬δ芤唬谶\行此功能日需要用到Judeg_Innum函數(shù)。先提示用戶按顯示的地圖上的景點輸入對應(yīng)的編號進行查詢。等待用戶輸入完編號后,讀入游客輸入要查詢的景點編號,然后用Judeg_Innum函數(shù)判斷輸入的編號,如果游客輸入值為-1 ,表示用戶 結(jié)束輸入,則 Judeg_Innum函數(shù)返回-1并結(jié)束信息查詢。如果游客輸入值不為-1 ,判斷游客輸入值是否合理(即是否在1-12范圍類以及對應(yīng)景點是否關(guān)閉),不合理的話提示游客輸 入有誤,返回1,

17、等待用戶再次輸入。如果游客輸入正確的話,再次判斷查詢的景點是否關(guān) 閉,如果景點關(guān)閉,輸出景點關(guān)閉及原因并返回1。如果Judeg_Innum函數(shù)返回值為1,跳3信息查詢)回開始,返回值不為-1和1,輸出景點名稱簡介并結(jié)束。流程圖如下圖(圖 所示。6.3.2 核心代碼/*景點信息查詢*/void Search_Intro(mgraphType *g)int s;do1*/printf("n請輸入你要查找的景點編號:"力scanf("%d",&s); /*輸入的編號比實際景點編號大while(judeg_Innum(s);printf("n

18、景點名稱:R%q nn",g->);printf("景點簡介:snn",g->ro);/*判斷用戶輸入的編號是否合理及對應(yīng)景點是否開放*/int judeg_Innum(int num)int i=0;if(num=-1) return i;if(num<1|num>12)printf("nttt你輸入的景點編號有誤,請輸入 1-12之間的數(shù)! nn");i=1;else if (cloNumnum-1.close=INFINITY)printf("nttt%s暫時

19、無法游覽!n",cloN);printf("ntt 關(guān)閉原因:sn",cloNumnum-1.reason);i=1;return i;6.4 兩景點最短路徑模塊6.4.1 詳細設(shè)計思想用floyed算法通過一個圖的權(quán)值矩陣求出它的每兩點間的最短路徑矩陣。從圖的帶權(quán)鄰接矩陣 A=a(i,j) nXn開始,遞歸地進行 n次更新,即由矩陣 D(0)=A , 按一個公式,構(gòu)造出矩陣D(1);又用同樣地公式由D(1)構(gòu)造出D(2);;最后又用同樣的公式由D(n-1)構(gòu)造出矩陣D(n)。矩陣D(n)的i行j列元素便是i號頂點到j(luò)號頂點的最 短路徑長度

20、,稱 D(n)為圖的距離矩陣,同時還可引入一個后繼節(jié)點矩陣path來記錄兩點間的最短路徑。具體算法思想如下:(1)從任意一條單邊路徑開始。所有兩點之間的距離是邊的權(quán),如果兩點之間沒有邊 相連,則權(quán)為無窮大。(2)對于每一對頂點u和v,看看是否存在一個頂點w使得從u到w再到v比已知的路徑更短。如果是更新它。(3)把圖用鄰接矩陣G表示出來,如果從 Vi到Vj有路可達,則 Gij=d , d表示該路的長度;否則 Gij=無窮大。定義一個矩陣D用來記錄所插入點的信息,Dij表示從Vi到Vj需要經(jīng)過的點,初始化 Dij=j。把各個頂點插入圖中,比較插點后的距離與原來的 距離,Gij = min( Gij

21、, Gik+Gkj),如果 Gij的值變小,則 Dij=k。在 G 中包含有兩點之間最短道路的信息,而在D中則包含了最短通路徑的信息。比如,要尋找從V5到V1的路徑。根據(jù)D,假如D(5,1)=3則說明從V5到V1經(jīng)過V3, 路徑為V5,V3,V1,如果D(5,3)=3 ,說明V5與V3直接相連,如果 D(3,1)=1,說明V3與 V1直接相連。進入該功能時,系統(tǒng)會首先提醒用戶輸入起點與終點編號,具體流程如圖5所示,待編號無誤后,利用floyed算法得出兩點間最短距離,算法流程如下。圖4弗洛伊德算法求兩景點間的一條最短的路徑開始圖5輸出并打印兩點間的最短路徑6.4.2 核心代碼/*弗洛伊德算法求

22、兩景點間的一條最短的路徑*/int distMM; /*距離向量類型*/int pathMM; /*路徑類型 */void ShortestPath_FLD(mgraphType *g)*/*弗洛伊德算法求兩景點間的一條最短的路徑并輸出所經(jīng)結(jié)點int i, j, k;for(i=0; i<g->vexNum; i+)/*初始化距離向量與路徑向量矩陣*/for(j=0; j<g->vexNum; j+)distij=g->edgsij;if(i!=j&&distij<INFINITY) pathij=i;else pathij=-1;/*-1f

23、or(k=0; k<g->vexNum; k+)/*for(i=0; i<g->vexNum; i+)for(j=0; j<g->vexNum; j+) /*if(distij>(distik+distkj)distij=distik+distkjpathij=k; /*path代表當(dāng)前兩點不可達*/遞推求解每兩景點的最短路徑*/更新distij 的值*/用于記錄最短路徑上的結(jié)點*/*遞歸實現(xiàn)打印兩點間的最短路徑*/void Floyd_Print(mgraphType *g, int sNum, int eNum)if(pathsNumeNum=-1

24、|pathsNumeNum=eNum|pathsNumeNum=sNum) return;else Floyd_Print(g,sNum,pathsNumeNum);/*將中間點作為終點繼續(xù)打印路徑*/printf("%s->",g->vexspathsNumeN);/*打印中間景點名字*/Floyd_Print(g,pathsNumeNum,eNum);/*將中間點作為起點繼續(xù)打印路徑*/6.5 多景點最佳路徑模塊6.5.1 詳細設(shè)計思想用戶依次輸入節(jié)點編號,即游覽順序。根據(jù)Floyd算法,算出第一個景點和第二個景點 的最短路徑,依次類推,算出多

25、景點的最短路徑。具體流程如下圖所示。圖6多景點求最佳路徑6.5.2 核心代碼/*多景點間求最佳路徑*/void Bestpath_Multispot(mgraphType *g)int vNumM=0,j=1;/*記錄用戶輸入的編號信息*/int d=0;/*統(tǒng)計全程總長*/printf("請輸入你要游覽的第撲景點的編號(輸入-1結(jié)束輸入):”,j);scanf("%d",&vNumj-1Dwhile(vNumj-1!=-1&&j<12)while(judeg_Innum(vNumj-1)printf("請輸入你要游覽的第d

26、個景點編號:",j);scanf("%d", &vNumj-1); if(vNumj-1=-1) break;printf("請輸入你要游覽的第d個景點編號:",+j);scanf("%d", &vNumj-1);printf("n這是最佳訪問路徑:");for(int i=0; vNumi>0&&vNumi+1>0; i+)輸出路徑上的起點*/利用佛洛依德算法*/輸出路徑上的終點*/printf("%s->”,g->vexsvNumi-1

27、.name); /*Floyd_Print(g,vNumi-1,vNumi+1-1); /* d+=distvNumi-1vNumi+1-1;printf("%sn'n",g->vexsvN); /* printf("全程總長為:dmn'n",d);6.6 求圖的關(guān)節(jié)點模塊6.6.1 詳細設(shè)計思想通過深搜優(yōu)先生成樹來判定。 從任一點出發(fā)深度優(yōu)先遍歷得到優(yōu)先生成樹,對于樹中任一頂點V而言,其孩子節(jié)點為鄰接點。由深度優(yōu)先生成樹可得出兩類割點的特性:(1 )若生成樹的根有兩棵或兩棵以上的子樹,則此根頂點必為割點。

28、因為圖中不存在連接不同子樹頂點的邊,若刪除此節(jié)點,則樹便成為森林;(2)若生成樹中某個非葉子頂點V,其某棵子樹的根和子樹中的其他節(jié)點均沒有指向V的祖先的回邊,則 V為割點。因為刪去 v,則其子樹和圖的其它部分被分割開來。仍然利用深搜算法,只不過在這里定義visitedv 表示為深度優(yōu)先搜索遍歷圖時訪問頂點 v 的次序號,定義 lowv=Minvisitedv , loww , visitedk ,其中 w 是頂點 v 在深度優(yōu)先生成樹上的孩子節(jié)點;k是頂點v在深度優(yōu)先生成樹上由回邊聯(lián)結(jié)的祖先節(jié)點。割點判定條件:如果對于某個頂點v,存在孩子節(jié)點 w且loww>=visitedv,則該頂點v

29、必為關(guān)節(jié)點。因為當(dāng)w是v的孩子節(jié)點時,loww>=visitedv ,表明w及其子孫均無 指向v的祖先的回邊,那么當(dāng)刪除頂點v后,v的孩子節(jié)點將于其他節(jié)點被分割開來,從來形成新的連通分量。流程圖如下。圖7深度遍歷找關(guān)節(jié)點圖8求校園交通圖關(guān)節(jié)點/*6.6.2 核心代碼/*深度遍歷找關(guān)節(jié)點*/#define ROOT -1/*#define COILA 1/*int visiM , coilaM=0; /*int coilaNum;/*void Dfs_Coila(mgraphType *g, int i)int child=0; /*根節(jié)點標(biāo)記*/關(guān)節(jié)點標(biāo)記*/根節(jié)點標(biāo)記或訪問標(biāo)記及關(guān)節(jié)點

30、*/統(tǒng)計校園圖關(guān)節(jié)點數(shù)目*/用于統(tǒng)計結(jié)點子樹數(shù)目*/if(visii!=ROOT)visii=1; /*將不是根結(jié)點的i結(jié)點標(biāo)記為已訪問*/for(int j=0; j<g->vexNum; j+) if(g->edgsij!= 0 && g->edgs皿!= INFINITY && !visij)表明i結(jié)點與j結(jié)點子樹加一/*/*child+; /*i Dfs_Coila(g, j);if(visii = ROOT && child >= 2) /*coilaNum+;/*coilai=COILA;/*/*求校園交

31、通圖關(guān)節(jié)點*/void Coila_Query(mgraphType *g)/*coilaNum = 0;/*for(int i=0; i<g->vexNum; i+) /* memset(visi, 0, sizeof(visi); /* visii = ROOT;/*DFSDfs_Coila(g, i);/*printf("ttt 校園圖的關(guān)節(jié)點個數(shù)為:for(int i=0; i<g->vexNum; i+)/*if(coilai = COILA) printf("結(jié)點之間可達,且j結(jié)點未被訪問*/*/遞歸,對j結(jié)點執(zhí)行同樣的操作*/若該點是根

32、并有大于等于2的子樹*/關(guān)節(jié)點總數(shù)加一 */將該點標(biāo)記為關(guān)節(jié)點*/關(guān)節(jié)點查詢*/關(guān)節(jié)點數(shù)目初始化*/對每個結(jié)點進行DFS*/標(biāo)記數(shù)組初始化*/之前,將該點標(biāo)記為根節(jié)點*/深度遍歷找關(guān)節(jié)點*/%dnnttt 分別為:",coilaNum);遍歷輸出關(guān)節(jié)點*/1%q t", g->);6.7 兩景點所有路徑模塊6.7.1 詳細設(shè)計思想兩景點間所有路徑的查詢依然是采用的DFS算法,每一次將起點壓入棧內(nèi),并將其標(biāo)記為已訪問,然后檢查其是否有未訪問的鄰接點,然后將其鄰接點作為起點采取深度搜索做相同的操作,若遇到路不通的時候,依次將棧內(nèi)的點推出,找其下一個未訪

33、問的鄰接點,直到找到終點,算法結(jié)束。算法結(jié)合 DFSW遞歸的方式,效率不高但很容易理解,具體實現(xiàn)如下 圖所示。圖9深度優(yōu)先遍歷查詢?nèi)我鈨蓚€景點之間的所有路徑6.7.2 核心代碼/*深度優(yōu)先遍歷查詢?nèi)我鈨蓚€景點之間的所有路徑*int pathStackM,top,count /*路徑棧,棧頂及路徑計數(shù)器*/int visitedM/*入棧(訪問)標(biāo)記 */void Dfs_Allpath(mgraphType *g,int sNum, int eNum)int dis=0;pathStacktop=sNum; top+; /*將本趟起點入棧 */visitedsNum=1;/*將入棧點標(biāo)記為已入

34、棧 */for(int i=0; i<g->vexNum; i+)/*表明兩點可達,且該點未未被訪問 */if(g->edgssNumi>0&&g->edgssNumN!=INFINNY&&!visitedi)if(i=eNum) /*如果深搜到了終點,就輸出剛才的路徑 */printf("第 d 條路:",count+);for(int j=0; j<top; j+)printf("%s->",g->vexspathS);if(j<top-1) /

35、* 統(tǒng)計路徑長度*/dis=dis+g->edgspathStackjpathStackj+1;dis=dis+g->edgspathStacktop-1eNum;printf("%sn",g->vexseN);printf("總長度是:%dmnn",dis);else /*如果該點不是終點,接著深度搜索*/Dfs_Allpath(g,i,eNum);top-; /*支路全被訪問一遍后,頂點出棧 */visitedi=0; /*將出棧點標(biāo)記為已出棧,允許下次訪問*/6.8 游客及管理員菜單模塊6.8.1 詳細設(shè)計思想游客菜

36、單的功能有:1.查看公告、2.我要留言。分別對應(yīng)查看管理員發(fā)布的公告以及留言給管理員的功能。這兩項功能的靈感均來自校園網(wǎng)認證的網(wǎng)頁,登錄校園網(wǎng)時我們不僅能及時從公告中獲取很多重要消息,也能通過留言反饋功能反饋自己在使用校園網(wǎng)中遇到的問題,對于游客來說,同樣如此,所以這兩項功能是必要的。管理員菜單的功能有:1.關(guān)閉某景點的游覽、2.恢復(fù)某景點的游覽、3.發(fā)布公告、4.查看游客留言。管理員菜單的功能主要體現(xiàn)在能夠關(guān)閉景點的游覽和發(fā)布公告,對于現(xiàn)實生活中,這兩項功能都是比較貼合實際的。這樣游客就能及時知道哪些景點不能游覽或者哪條路無法通行。具體實現(xiàn)如下方圖10及圖11所示。圖10游客菜單圖11管理員

37、菜單6.8.2核心代碼/*管理員菜單*/structchar name20;int close;int reason100;cloNumM;char Affiche200="NULL" /* 公告 */void Admin_Menu(mgraphType *g)char buf1024;/* 緩沖區(qū)*/int len; /*行字符個數(shù)*/FILE *fp;int s=1,num,account=0,password=0;while(account!=150708|password!=150708)printf("請輸入你的管理賬號:");scanf(&q

38、uot;%d",&account);printf("n請輸入你的管理密碼:");scanf("%d",&password);if(account!=150708|password!=150708)printf("tttt賬號或密碼錯誤,請重新輸入!n");elseprintf("nttttttt登錄成功! nn");Sleep (1000);while(s>0&&s<5)system("cls");Dis_Map();printf("

39、;1.關(guān)閉景點2.恢復(fù)景點3.發(fā)布公告4.查看留言n");printf("tn請選擇你的操作(其余按鍵返回主菜單):");scanf("%d",&s);switch(s)case 1:printf("n請輸入你要關(guān)閉景點的編號:");scanf("%d",&num);if(num<0|num>12)printf("ntttt對不起,沒有該編號對應(yīng)的景點n");elsecloNumnum-1.close=INFINITY;strcpy(cloNumnum-1.

40、name,g->);printf("n 關(guān)閉景點成功,請輸入關(guān)閉s的原因:",g->);scanf("%s",cloNumnum-1.reason);printf("n 關(guān)閉景點成功! n);system("pause");break;case 2:printf("n請輸入你要恢復(fù)景點的編號:");scanf("%d",&num);if(num<0|num>12)printf("ntttt

41、對不起,沒有該編號對應(yīng)的景點n");elsecloNumnum-1.close=0;printf("nt%s景點恢復(fù)成功!n",g->);system("pause");break;case 3:printf("n請輸入公告內(nèi)容:"力scanf("%s",Affiche);printf("ntttt公告發(fā)布成功!n");system("pause");break;case 4:if(fp = fopen("liuyan.t

42、xt","r") = NULL)printf("ntttt目前暫無游客留言");exit ;printf("n 以下是游客留言:n");while(fgets(buf,1024,fp) != NULL) /*gets讀取一行 */len = strlen(buf);buflen-1 = '0'/*去掉換行符 */printf("t%sn",buf,len - 1);printf("n");system("pause");break;default:p

43、rintf("n");/*游客菜單*/void Tour_Menu(mgraphType *g)int s=1,i=1;char ly250; FILE *fp; /* 臨時存放用戶輸入的留言 */while(s>0&&s<3)system("cls");Dis_Map();printf("ni i n");printf("t1.查看公告I I 2.我要留言| n");printf("t1 1 n");printf("nt請選擇你的操作(其余按鍵返回主菜單)

44、:");scanf("%d",&s);switch(s)case 1:if(!strcmp(Affiche,"NULL")printf("nttttt目前暫時無任何公告n");system("pause");else printf("nn公告內(nèi)容如下:nnt%snn",Affiche);system("pause");break;case 2:fp=fopen("liuyan.txt","a"); /*以追加的方式添加

45、文本*/while(i)printf("n請輸入你的留言:");*/scanf("%s",ly);time_t t; /*得到從標(biāo)準計時點到當(dāng)前時間的秒數(shù)struct tm *p;t=time(NULL);p=localtime(&t); /*時間轉(zhuǎn)換后賦給 p*/fprintf(fp," 留言時間:s 留言內(nèi)容:sn",asctime(p),ly);printf("n留言時間:sn 留言內(nèi)容:s",asctime(p),ly);printf("nn是否要繼續(xù)留言(是:1否:0):");

46、scanf("%d",&i);fclose(fp);break;default:printf("nttttt返回主菜單! n");7.源碼文件Ps:從7開始以下內(nèi)容均不用在說明書中寫明,這里僅僅做補充作用,給大家一個參考。7.1源碼源碼說明:因代碼過多,不得已將字體與行距和縮小,全程格式無更改,拷貝可用。編譯環(huán)境:vs201x#include <stdio.h>#include <stdlib.h>#include <time.h>#include <windows.h>#define INFINI

47、TY 9999#define M 20/*此處用9999代表無窮大*/*最大頂點數(shù)*/typedef struct int num;char name20;char intro200;vertexType;/*景點信息結(jié)構(gòu)定義*/*景點代號*/*景點名稱*/*景點簡介*/*鄰接矩陣頂點結(jié)構(gòu)*/typedef int edgeType; typedef struct vertexType vexsM; edgeType edgsMM; int vexNum, edgNum; mgraphType;/*權(quán)值類型*/*校園景點圖結(jié)構(gòu)體定義*/*頂點值類型*/*邊權(quán)值類型-距離*/*圖頂點總數(shù)與邊數(shù)*

48、/*函數(shù)一覽表*/void main();int menu();void Creat_Map(mgraphType *g);void Dis_Map();void Admin_Menu(mgraphType *g);void Tour_Menu(mgraphType *g);int judeg_Innum(int num);void Search_Intro(mgraphType *g);void ShortestPath_FLD(mgraphType *g);void Floyd_Print(mgraphType,int,int);void ShortestPath_Print(mgraph

49、Type);void Dfs_Allpath(mgraphType,int,int);void Allpath_Print(mgraphType *g);void Bestpath_Multispot(mgraphType);void Dfs_Coila(mgraphType *g, int i);void Coila_Query(mgraphType *g);void System_Exit(int *quit);/*主函數(shù)*/*主菜單*/*從文件讀取信息建立圖*/*顯示校園景點地圖*/*管理員菜單*/*游客菜單*/*判斷用戶輸入的編號是否合理及對應(yīng)景點是否開放/*景點信息查詢*/;/*弗洛

50、伊德算法求任意景點間最短的路徑*/*遞歸實現(xiàn)打印兩點間的最短路徑*/*輸出并打印兩點間的最短路徑*/*深度優(yōu)先遍歷查詢?nèi)我鈨蓚€景點之間的所有路徑*/*查詢?nèi)我鈨蓚€景點之間的所有路徑并打印 */*多景點間求最佳路徑*/*深度遍歷找關(guān)節(jié)點*/*求校園交通圖關(guān)節(jié)點*/*退出系統(tǒng)函數(shù)*/*/*校園景點圖的讀取與創(chuàng)建*/void Creat_Map(mgraphType *g)int i, j, k, e;FILE *rf;rf = fopen("map.txt","r");if(rf)/*從文件讀取圖的信息并建立圖*/*定義帶緩沖的文件指針*/*從文件讀取圖的邊

51、信息*/*讀入圖的頂點數(shù)和邊數(shù)*/fscanf(rf,"%d%d",&g->vexNum, &g->edgNum);/* 讀入圖的頂點數(shù)與邊數(shù) */ for(i=0; i<g->vexNum; i+)/* 讀入圖的頂點信息 */fscanf(rf,"%d%s%s",&g->vexsi.num,g->,g->ro);for(i=0; i<g->vexNum; i+)/* 初始化領(lǐng)接矩陣 */for(j=0; j<g->vexNum

52、; j+)if(i=j) g->edgsij=0;/*到本結(jié)點的距離為0,其余不可達*/else g->edgsij=INFINITY; for(k=0; k<g->edgNum; k+)/*讀入圖的邊權(quán),建立無向圖 */fscanf(rf,"%d%d%d",&i,&j,&e);/*文件中以三元組的形式存儲圖的信息*/g->edgsij=g->edgsji=e; /* 建立無向圖 */ fclose(rf);/* 關(guān)閉文件 */ else g->edgNum=0;/*校園景點圖的顯示*/printf(&quo

53、t;n中北大學(xué)校園景點地圖一覽nn");printf("(1。)瑾瑜國際會議中心n");printf("校醫(yī)院游泳館n");printf(" 1n");printf("11L11n");printf("1ILOn");printf("科藝苑1圖書館1田園餐廳n");printf("11n");printf("二龍山11111n");printf("11n");void Dis_Map()printf(&qu

54、ot; printf(" printf(" printf(" printf(" printf(" printf("柏林園I小吃一條街中北大學(xué)一道門主體育場中北主樓n");n");n");n");n");n");nn");/*管理員菜單*/ structchar name20;int close;int reason100;cloNumM;/*存放關(guān)閉景點的名字*/*景點關(guān)閉標(biāo)記,值為INFINITY代表景點被關(guān)閉*/*存放景點關(guān)閉的原因*/*景點關(guān)閉標(biāo)記結(jié)構(gòu)體*/c

55、har Affiche200="NULL" /* 存放管理員發(fā)布的公告 */ void Admin_Menu(mgraphType *g)char buf1024;int len;FILE *fp;/*緩沖區(qū)*/*行字符個數(shù)*/int s=1,num,account=0,password=0;while(account!=150708|password!=150708)printf("請輸入你的管理賬號:");scanf("%d",&account);printf("n請輸入你的管理密碼:");scanf("%d",&password);if(account!=150708|password!=150708)printf("tttt賬號或密碼錯誤,請重新輸入!n");elseprintf("nttttttt 登錄成功! nn");Sleep (1000);while(s>0&&s<5)system("cls");Dis_Map();prin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論