




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、-. z課 程 設(shè) 計(jì) 說 明 書課程名稱數(shù)據(jù)構(gòu)造課程設(shè)計(jì)設(shè)計(jì)課題校園導(dǎo)游程序?qū)I(yè)計(jì)算機(jī)科學(xué)與技術(shù)班級(jí)*完成日期課 程 設(shè) 計(jì) 任 務(wù) 書設(shè)計(jì)題目:校園導(dǎo)游程序設(shè)計(jì)容與要求:問題描述用無向網(wǎng)表示你所在學(xué)校的校園景點(diǎn)平面圖,圖中頂點(diǎn)表示主要景點(diǎn),存放景點(diǎn)的編號(hào)、名稱、簡介等信息,圖中的邊表示景點(diǎn)間的道路,存放路徑長度等信息。要求能夠答復(fù)有關(guān)景點(diǎn)介紹、游覽路徑等問題。根本要求 1 查詢各景點(diǎn)的相關(guān)信息;2 查詢圖中任意兩個(gè)景點(diǎn)間的最短路徑。3 查詢圖中任意兩個(gè)景點(diǎn)間的所有路徑。4 增加、刪除、更新有關(guān)景點(diǎn)和道路的信息。 指導(dǎo)教師:2016年 12月 20日課 程 設(shè) 計(jì) 評(píng) 語 成績: 指導(dǎo)教師:
2、_ 年 月 日-. z目錄TOC o 1-3 h z uHYPERLINK l _Toc470807539一、問題描述 PAGEREF _Toc470807539 h 1HYPERLINK l _Toc470807540二、根本要求 PAGEREF _Toc470807540 h 1HYPERLINK l _Toc470807541三、測試數(shù)據(jù) PAGEREF _Toc470807541 h 2HYPERLINK l _Toc470807542四、算法思想 PAGEREF _Toc470807542 h 3HYPERLINK l _Toc470807543五、模塊劃分 PAGEREF _Toc
3、470807543 h 4HYPERLINK l _Toc4708075445.1應(yīng)用函數(shù) PAGEREF _Toc470807544 h 4HYPERLINK l _Toc470807545主函數(shù) PAGEREF _Toc470807545 h 5HYPERLINK l _Toc470807546查詢景點(diǎn)信息函數(shù) PAGEREF _Toc470807546 h 6HYPERLINK l _Toc470807547查詢兩景點(diǎn)之間最短路徑函數(shù) PAGEREF _Toc470807547 h 6HYPERLINK l _Toc470807548查詢兩景點(diǎn)之間所有路徑函數(shù) PAGEREF _Toc4
4、70807548 h 7HYPERLINK l _Toc470807549刪除已有的頂點(diǎn)和路徑 PAGEREF _Toc470807549 h 8HYPERLINK l _Toc470807550修改已有的頂點(diǎn)和路徑 PAGEREF _Toc470807550 h 9HYPERLINK l _Toc470807551六、數(shù)據(jù)構(gòu)造 PAGEREF _Toc470807551 h 10HYPERLINK l _Toc470807552七、測試 PAGEREF _Toc470807552 h 11HYPERLINK l _Toc470807553八、心得 PAGEREF _Toc470807553
5、h 19HYPERLINK l _Toc470807554九、源程序 PAGEREF _Toc470807554 h 20-. z問題描述用無向網(wǎng)表示你所在學(xué)校的校園景點(diǎn)平面圖,圖中頂點(diǎn)表示主要景點(diǎn),存放景點(diǎn)的編號(hào)、名稱、簡介等信息,圖中的邊表示景點(diǎn)間的道路,存放路徑長度等信息。要求能夠答復(fù)有關(guān)景點(diǎn)介紹、游覽路徑等問題。二、 根本要求1 查詢各景點(diǎn)的相關(guān)信息;2 查詢圖中任意兩個(gè)景點(diǎn)間的最短路徑。3 查詢圖中任意兩個(gè)景點(diǎn)間的所有路徑。4 增加、刪除、更新有關(guān)景點(diǎn)和道路的信息。三、 測試數(shù)據(jù)菜單函數(shù):依次輸入:1,2,3,4,5,6,0 分別對(duì)應(yīng)景點(diǎn)信息查詢,最短路徑查詢,所有路徑查詢,添加景點(diǎn)
6、及路徑信息,刪除景點(diǎn)及路徑信息,修改景點(diǎn)及路徑信息,退出。查詢景點(diǎn)信息:輸入:1,2分別對(duì)應(yīng)按編號(hào)查詢,按景點(diǎn)名稱查詢按編號(hào)查詢:輸入編號(hào):1按景點(diǎn)名稱查詢:輸入名稱:大明橋最短路徑查詢:輸入起始景點(diǎn)和終點(diǎn)景點(diǎn)編號(hào):1,7所有路徑查詢:輸入起始景點(diǎn)和終點(diǎn)景點(diǎn)編號(hào):2,8添加景點(diǎn)及路徑信息:輸入新景點(diǎn)序號(hào):9輸入新景點(diǎn)名稱:南門 輸入新景點(diǎn)相關(guān)信息:充滿古韻的門,適合拍照 輸入到其余各景點(diǎn)的距離:50,100,20刪除景點(diǎn)及路徑信息:輸入:1,2分別對(duì)應(yīng)按編號(hào)查詢,按景點(diǎn)名稱查詢按編號(hào)查詢:輸入需要?jiǎng)h除的景點(diǎn)編號(hào):8修改景點(diǎn)及路徑信息:輸入:1,2分別對(duì)應(yīng)修改景點(diǎn)信息,修改道路信息修改景點(diǎn)信息:
7、輸入1,2分別對(duì)應(yīng)修改景點(diǎn)名稱,修改景點(diǎn)描述修改景點(diǎn)信息:輸入修改序號(hào):1 輸入修改后的名稱:圖書館123-. z四、算法思想先利用CreateUDN 創(chuàng)立初始無向網(wǎng),通過main主函數(shù)調(diào)用顯示,操作功能的選擇通過Menu函數(shù)輸出,根據(jù)游客需求選擇景點(diǎn)信息查詢、景點(diǎn)之間最短路徑查詢、景點(diǎn)之間所有路徑查詢、添加景點(diǎn)信息、刪除景點(diǎn)信息或者修改信息。如果是景點(diǎn)信息查詢, 在search中完成,再調(diào)用SearchMenu選擇是按照景點(diǎn)編號(hào)或者景點(diǎn)名稱查詢,游客輸入相應(yīng)容。如果是景點(diǎn)之間最短路徑查詢或是景點(diǎn)之間所有路徑查詢則游客輸入起始景點(diǎn)和完畢景點(diǎn);最短路徑是用ShortestPath實(shí)現(xiàn),其中運(yùn)用了
8、迪杰斯特拉算法;所有路徑由Searchpath1調(diào)用disppath再調(diào)用path,在path過遞歸算法實(shí)現(xiàn)尋找每一條路并輸出。如果是添加景點(diǎn)信息調(diào)用Addnewsight函數(shù),游客按照提示依次輸入信息容。如果是刪除景點(diǎn)信息,選擇按照名稱刪除或是按照序號(hào)刪除,再調(diào)用Deletesight函數(shù),游客輸入相應(yīng)容進(jìn)展刪除。如果是修改信息,調(diào)用Changesight,Changemenu兩個(gè)函數(shù),游客按提示選擇修改景點(diǎn)信息或者道路信息,再按提示輸入修改后得容。輸出使用調(diào)用的相應(yīng)函數(shù)。信息保存于文件中。校園導(dǎo)游圖添加景點(diǎn)和路徑查詢所有路徑查詢最短路徑修改景點(diǎn)和路徑修改路徑修改景點(diǎn)刪除景點(diǎn)和路徑按編號(hào)按名
9、稱查詢景點(diǎn)信息按編號(hào)按名稱修改名稱修改描述五、 模塊劃分5.1應(yīng)用函數(shù)void CreateUDN(int v,int a); /* 造圖函數(shù) */void narrate(); /*說明函數(shù)*/void ShortestPath(int num); /*最短路徑函數(shù)*/void output(int sight1,int sight2); /*輸出函數(shù)*/int Menu(); /* 主菜單 */void search(); /* 查詢景點(diǎn)信息 */int SearchMenu(); /* 查詢子菜單 */void HaMiTonian(int); /* 圖的遍歷 */void Search
10、path1(MGraph g); /*查詢兩個(gè)景點(diǎn)間的所有路徑*/void disppath(MGraph g,int i,int j);void path(MGraph g,int i,int j,int k);/*確定路徑上第k+1個(gè)頂點(diǎn)的序號(hào)*/void Ne*tValue(int); void display(); /* 顯示遍歷結(jié)果 */int Addnewsight(int n); /*添加新的景點(diǎn)和路徑*/int Deletesight(); /*刪除景點(diǎn)和路徑*/void Changesight(); /*修改景點(diǎn)和路徑*/int Changemenu(); /*修改路徑或頂點(diǎn)
11、的選擇菜單*/int Sightmenu(); /*選擇需該景點(diǎn)的菜單*/5.2.1主函數(shù)1.功能:初始圖通過main主函數(shù)調(diào)用顯示,操作功能的選擇通過Menu函數(shù)輸出,顯示為菜單形式提醒用戶進(jìn)展操作,用戶選擇后在main主函數(shù)中調(diào)用各個(gè)函數(shù)實(shí)現(xiàn)各種功能。2.流程圖:6101432151 輸入相應(yīng)序號(hào) 完畢 開場查詢信息刪除信息所有路徑添加信息最短路徑修改信息退出景點(diǎn)信息和操作目錄5.2.2查詢景點(diǎn)信息函數(shù)1.功能:在main主函數(shù)中調(diào)用search,翻開存儲(chǔ)了信息的文件,在顯示界面顯示已有的景點(diǎn)名稱和序號(hào),游客按需求進(jìn)展序號(hào)查詢或者名稱查詢,輸入需要查詢的序號(hào)或者名稱后會(huì)顯示該景點(diǎn)的名稱及簡
12、介,而后按任意鍵返回上級(jí)菜單項(xiàng)選擇擇繼續(xù)查詢或者返回主界面,在查詢景點(diǎn)信息函數(shù)中實(shí)現(xiàn)。2.流程圖:noyes21 開場按編號(hào)查詢按景點(diǎn)查詢 完畢 輸入相關(guān)信息是否有此景點(diǎn)?沒有找到! 輸出景點(diǎn)信息5.2.3查詢兩景點(diǎn)之間最短路徑函數(shù)1.功能:在main函數(shù)中調(diào)用narrate函數(shù),翻開存儲(chǔ)了信息的文件,游客輸入起點(diǎn)編號(hào)或者終點(diǎn)編號(hào),利用迪杰斯特拉算法由ShortestPath最短路徑函數(shù) 選擇一條兩點(diǎn)之間的最短路徑展示給游客,關(guān)閉文件。5.2.4查詢兩景點(diǎn)之間所有路徑函數(shù)1.功能:當(dāng)游客輸入完畢后,根據(jù)之前構(gòu)建的無向圖,執(zhí)行過程為進(jìn)層和退層兩個(gè)階段。首先開場遞歸進(jìn)層,考慮使用基于深度優(yōu)先思想,
13、在搜素過程中,按照景點(diǎn)編號(hào)大小依次每一個(gè)節(jié)點(diǎn),假設(shè)到一個(gè)未被且有路徑相通的點(diǎn)則將其參加數(shù)組P,直到找到目的地,輸出第一條路徑,然后開場遞歸退層,按照之前的方式遞歸它的所有未被的相鄰節(jié)點(diǎn)。并通過相應(yīng)的設(shè)置標(biāo)志visited的方式使最終能不重復(fù)地走遍所有的簡單路徑。最后輸出這些路徑即可。5.2.5添加新的頂點(diǎn)和路徑1.功能:在Addnewsight添加新的景點(diǎn)和路徑函數(shù) 中實(shí)現(xiàn),翻開存儲(chǔ)了信息的文件,輸入需要新添加的景點(diǎn)名稱,根本信息介紹并依次輸入它到原有各景點(diǎn)的距離,將新信息存儲(chǔ)到文件中并保存。5.2.6刪除已有的頂點(diǎn)和路徑1.功能:刪除不需要的景點(diǎn)信息,并保存刪除后的文件,方便下一次瀏覽。2流
14、程圖:21no 完畢 是否有此景點(diǎn)?輸入需要?jiǎng)h除的景點(diǎn)刪除成功沒有找到y(tǒng)es 開場按景點(diǎn)編號(hào)按景點(diǎn)名稱5.2.7修改已有的頂點(diǎn)和路徑1.功能:修改有誤的景點(diǎn)信息,并保存修改后的文件,方便下一次瀏覽。2流程圖:221221 開場修改道路信息 完畢 輸入相關(guān)信息修改景點(diǎn)信息 輸入道路信息 輸入景點(diǎn)編號(hào)修改景點(diǎn)名稱修改景點(diǎn)描述 輸入相關(guān)信息六、 數(shù)據(jù)構(gòu)造MGraph定義圖的類型 ,其中包含景點(diǎn),景點(diǎn)之間的距離,景點(diǎn)數(shù)和邊數(shù)。Verte*Type是景點(diǎn)的構(gòu)造體,里面包含了景點(diǎn)編號(hào),景點(diǎn)名稱,景點(diǎn)描述。ArcCell是邊的構(gòu)造體,其中包含了邊的長度即景點(diǎn)之間的距離。typedef struct ArcC
15、ellint adj; /* 相鄰接的景點(diǎn)之間的路程 */ArcCell; /* 定義邊的類型 */typedef struct Verte*Typeint number; /* 景點(diǎn)編號(hào) */char sight100; /* 景點(diǎn)名稱 */ char description1000; /* 景點(diǎn)描述 */Verte*Type; /* 定義頂點(diǎn)的類型 */typedef structVerte*Type ve*20; /* 圖中的頂點(diǎn),即為景點(diǎn) */ArcCell arcs2020; /* 圖中的邊,即為景點(diǎn)間的距離 */int ve*num,arum; /* 頂點(diǎn)數(shù),邊數(shù) */MGraph
16、; /* 定義圖的類型 */七、 測試7.1.測試數(shù)據(jù)輸入:根據(jù)游客需求選擇景點(diǎn)信息查詢、景點(diǎn)之間最短路徑查詢、景點(diǎn)之間所有路徑查詢、添加景點(diǎn)信息、刪除景點(diǎn)信息或者修改信息。如果是景點(diǎn)信息查詢,再選擇是按照景點(diǎn)編號(hào)或者景點(diǎn)名稱查詢,游客輸入相應(yīng)容;如果是景點(diǎn)之間最短路徑查詢或是景點(diǎn)之間所有路徑查詢則游客輸入起始景點(diǎn)和完畢景點(diǎn);如果是添加景點(diǎn)信息則按照提示依次輸入信息容;如果是刪除景點(diǎn)信息,選擇按照名稱刪除或是按照序號(hào)刪除,再輸入相應(yīng)容進(jìn)展刪除;如果是修改信息,按提示選擇修改景點(diǎn)信息或者道路信息,再按提示輸入修改后得容預(yù)期的輸出結(jié)果:運(yùn)行程序直接出現(xiàn)各景點(diǎn)及其編號(hào),同時(shí)出現(xiàn)操作菜單,其他結(jié)果依使
17、用者需求而定,請(qǐng)參見程序后的運(yùn)行結(jié)果。菜單函數(shù)2.查詢景點(diǎn)信息按編號(hào)3.查詢景點(diǎn)信息按名稱4.查詢兩景點(diǎn)之間的最短路徑5.查詢兩點(diǎn)之間的所有路徑6.添加新的景點(diǎn)及其路徑添加過程添加后7.刪除景點(diǎn)刪除過程刪除后8.修改景點(diǎn)信息修改后9.文件容八、 心得通過對(duì)這次對(duì)校園導(dǎo)游系統(tǒng)程序編寫,我切實(shí)體會(huì)到了如何編寫一個(gè)較大的程序。這是我自己相對(duì)獨(dú)立做的最大的一個(gè)程序,過程中遇到了各種各樣的問題。但同時(shí)穩(wěn)固了課堂上所學(xué)的知識(shí),也學(xué)到了很多新的東西,也收獲了很多。 拿到題目,第一步就是構(gòu)思,分析,創(chuàng)立。題目要求用無向網(wǎng)完成,所以我考慮的是用鄰接矩陣存儲(chǔ)這個(gè)無向網(wǎng),參考了書上的無向網(wǎng)的鄰接矩陣存儲(chǔ)程序?qū)懥薈r
18、eatUDN。查詢兩個(gè)景點(diǎn)之間的最短路徑剛開場我參考的是書上的迪杰斯特拉算法,后來發(fā)現(xiàn)書上定義的頂點(diǎn)的構(gòu)造體數(shù)組容太簡單,程序考慮的情況也很簡單,無法滿足我題目的需求,于是我又把迪杰斯特拉算法研讀了一遍,自己做了改良。查找所有路徑的Searchpath1函數(shù)剛開場一直沒有寫出來,我和同學(xué)先在紙上畫出頂點(diǎn),參考深度優(yōu)先遍歷把整個(gè)路徑走了一遍,但是編程沒有什么思路,上網(wǎng)查找了關(guān)于這個(gè)算法的資料,看到有人說可以考慮用遞歸實(shí)現(xiàn),就試著用遞歸實(shí)現(xiàn),同時(shí)參照迪杰斯特拉算法用一個(gè)數(shù)組收集過的頂點(diǎn),還設(shè)置了一個(gè)標(biāo)志量標(biāo)記頂點(diǎn)是否被。文件在上學(xué)期的課設(shè)中我寫過,當(dāng)時(shí)學(xué)習(xí)了一些關(guān)于文件的知識(shí),所以運(yùn)用并沒有遇到太
19、多問題,利用文件保存數(shù)據(jù),需要fopen翻開文件進(jìn)展讀寫,還要fclose函數(shù)進(jìn)展關(guān)閉操作,可能還會(huì)用到fread讀取文件。后來知道a+可以繼續(xù)錄入,于是我通過參加一個(gè)a+形式的語句,實(shí)現(xiàn)了可不定時(shí)地增加景點(diǎn)數(shù)據(jù)的功能所有框架寫查找、刪除、修改和添加函數(shù)本身并不太難,寫好以后用main函數(shù)調(diào)用可以了。寫出框架后,剛開場運(yùn)行也是沒什么問題的,但是多做幾步就遇到了問題。在添加的時(shí)候,剛開場沒有考慮序號(hào),程序自動(dòng)生成的序號(hào)和我想。要的并不是一種,于是我在添加景點(diǎn)里面讓游客自己輸入序號(hào)。后來又發(fā)現(xiàn)刪除沒有考慮找不到需要?jiǎng)h除的目標(biāo)的可能性,用一個(gè)判斷符a來判斷是否刪除成功。接下來整個(gè)運(yùn)行都沒有錯(cuò)但是如果
20、刪除兩個(gè)景點(diǎn)就會(huì)出現(xiàn)問題了,試了很久發(fā)現(xiàn)是循環(huán)條件有問題,雖然固定了景點(diǎn)編號(hào)number,但是循環(huán)的num和number不能對(duì)應(yīng),于是去詢問教師,教師說可以把整個(gè)鄰接矩陣重新修改或者設(shè)置特殊符號(hào)控制輸出,我選擇了相對(duì)簡便的修改方法。這個(gè)程序很長,編寫花了很多時(shí)間,在程序編寫過程中,我不斷遇到困難,調(diào)試時(shí)更是出現(xiàn)了很多問題,一個(gè)個(gè)的修改,有的花了很長的時(shí)間。但我的努力和辛苦沒有白費(fèi),在教師的指導(dǎo),同學(xué)的幫助,和自己的努力下我終于完成了這個(gè)程序。很感教師最后的點(diǎn)睛之筆,在我和同學(xué)冥思苦想很長時(shí)間都沒有解決方案的時(shí)候是教師幫助我們解決了問題。同時(shí)也反映出我思考問題的不全面和經(jīng)歷的欠缺。 在程序編寫和
21、解決問題時(shí),每一個(gè)細(xì)節(jié)都很重要,既要防止功能的重復(fù)也要防止功能疏漏的地方。理論和實(shí)踐相結(jié)合是學(xué)好數(shù)據(jù)構(gòu)造的關(guān)鍵,這次的課設(shè)既培養(yǎng)了我們的自學(xué)能力,也提高了我們的學(xué)習(xí)興趣。九、 源程序#include #include #include #include #define Ma* 20000typedef struct ArcCellint adj; /* 相鄰接的景點(diǎn)之間的路程 */ArcCell; /* 定義邊的類型 */typedef struct Verte*Typeint number; /* 景點(diǎn)編號(hào) */ char sight100; /* 景點(diǎn)名稱 */ char descript
22、ion1000; /* 景點(diǎn)描述 */Verte*Type; /* 定義頂點(diǎn)的類型 */typedef structVerte*Type ve*20; /* 圖中的頂點(diǎn),即為景點(diǎn) */ ArcCell arcs2020; /* 圖中的邊,即為景點(diǎn)間的距離 */ int ve*num,arum; /* 頂點(diǎn)數(shù),邊數(shù) */MGraph; /* 定義圖的類型 */FILE *fp,*count ; /*變量類型聲明,聲明fp是FILE型指針,用于指向file類型 */MGraph G; /* 把圖定義為全局變量 */char nameofschool100; /*學(xué)校名稱*/ int NUM=9;i
23、nt P2020; /* 用來存放圖中的邊 */int p20; /*全局?jǐn)?shù)組,用來存放路徑上的各頂點(diǎn)*/int visited20; /*全局?jǐn)?shù)組,用來記錄各頂點(diǎn)被的情況*/int a=0; /*全局變量,用來記錄每對(duì)頂點(diǎn)之間的所有路徑的條數(shù)*/long int D20; /* 輔助變量存儲(chǔ)最短路徑長度 */void CreateUDN(int v,int a); /* 造圖函數(shù) */void narrate(); /*說明函數(shù)*/void ShortestPath(int num); /*最短路徑函數(shù)*/void output(int sight1,int sight2); /*輸出函數(shù)*
24、/int Menu(); /* 主菜單 */void search(); /* 查詢景點(diǎn)信息 */int SearchMenu(); /* 查詢子菜單 */void HaMiTonian(int); /* 圖的遍歷 */void Searchpath1(MGraph g); /*查詢兩個(gè)景點(diǎn)間的所有路徑*/void disppath(MGraph g,int i,int j);void path(MGraph g,int i,int j,int k); /*確定路徑上第k+1個(gè)頂點(diǎn)的序號(hào)*/void Ne*tValue(int); void display(); /* 顯示遍歷結(jié)果 */int
25、 Addnewsight(int n); /*添加新的景點(diǎn)和路徑*/int Deletesight(); /*刪除景點(diǎn)和路徑*/void Changesight(); /*修改景點(diǎn)和路徑*/int Changemenu(); /*修改路徑或頂點(diǎn)的選擇菜單*/int Sightmenu(); /*選擇需該景點(diǎn)的菜單*/void main() /* 主函數(shù) */ int v0,v1; int ck; CreateUDN(NUM,11); do ck=Menu(); switch(ck)case 1: search(); break; case 2:system(cls);narrate(); pr
26、intf(nnttt請(qǐng)選擇起點(diǎn)景點(diǎn)0%d:,NUM-1); scanf(%d,&v0); printf(ttt請(qǐng)選擇終點(diǎn)景點(diǎn)0%d:,NUM-1); scanf(%d,&v1); ShortestPath(v0); /* 計(jì)算兩個(gè)景點(diǎn)之間的最短路徑 */ output(v0,v1); /* 輸出結(jié)果 */ printf(nntttt請(qǐng)按任意鍵繼續(xù).n); getchar(); getchar();break; case 3:system(cls); narrate(); Searchpath1(G); printf(nntttt請(qǐng)按任意鍵繼續(xù).n); getchar(); getchar();
27、 break;case 4: system(cls); narrate(); NUM=Addnewsight(NUM); system(cls); narrate(); break;case 5: NUM=Deletesight(); break;case 6:Changesight(); break;while(ck!=0); int Menu() /* 主菜單 */ int c; int flag; do flag=1; system(cls); narrate(); printf(ntttn); printf(tttn); printf(ttt 1、查詢景點(diǎn)信息 n); printf(t
28、tt 2、查詢兩景點(diǎn)間最短路徑 n); printf(ttt 3、查詢兩景點(diǎn)間所有路線 n); printf(ttt 4、添加新的景點(diǎn)和路徑 n); printf(ttt 5、刪除已有景點(diǎn)和路徑 n); printf(ttt 6、修改已有景點(diǎn)或路徑 n); printf(ttt 0、退出 n); printf(tttn); printf(tttn); printf(tttt請(qǐng)輸入您的選擇:); scanf(%d,&c); if(c=1|c=2|c=3|c=4|c=5|c=6|c=0) flag=0; while(flag); return c;int SearchMenu() /* 查詢子菜單
29、函數(shù) */ int c; int flag; do flag=1; system(cls); narrate(); printf(ntttn); printf(tttn); printf(ttt 1、按照景點(diǎn)編號(hào)查詢 n); printf(ttt 2、按照景點(diǎn)名稱查詢 n); printf(ttt 0、返回 n); printf(tttn); printf(tttn); printf(tttt請(qǐng)輸入您的選擇:); scanf(%d,&c); if(c=1|c=2|c=0) flag=0; while(flag); return c;void search() /* 查詢景點(diǎn)信息函數(shù) */ in
30、t num; int i; int c; char name20; fp=fopen(guide.t*t,r+); /*讀翻開原文件book.t*t*/ count=fopen(count.t*t,r+); /*讀寫count文件*/ do system(cls); c=SearchMenu(); switch (c) case 1: system(cls); narrate(); printf(nntt請(qǐng)輸入您要查找的景點(diǎn)編號(hào):); scanf(%d,&num); for(i=0;iNUM;i+) if(num=G.ve*i.number) printf(nnttt您要查找景點(diǎn)信息如下:);
31、 printf(nnttt%s: %-25snn,G.ve*i.sight,G.ve*i.description); printf(nttt按任意鍵返回.); getchar(); getchar(); break; if(i=NUM) printf(nnttt沒有找到!); printf(nnttt按任意鍵返回.); getchar(); getchar(); break; case 2: system(cls); narrate(); printf(nntt請(qǐng)輸入您要查找的景點(diǎn)名稱:); scanf(%s,name); for(i=0;iNUM;i+) if(!strcmp(name,G.
32、ve*i.sight) printf(nnttt您要查找景點(diǎn)信息如下:); printf(nnttt%s:%-25snn,G.ve*i.sight,G.ve*i.description); printf(nttt按任意鍵返回.); getchar(); getchar(); break; if(i=NUM) printf(nnttt沒有找到!); printf(nnttt按任意鍵返回.); getchar(); getchar(); break; while(c!=0); fwrite(&G,sizeof(MGraph),1,fp); /*保存到文件中*/ fclose(fp); fprint
33、f(count,%d,NUM); fclose(count);void CreateUDN(int v,int a) /* 創(chuàng)立初始圖函數(shù) */ int i,j; if(fp=fopen(guide.t*t,a+)=NULL) /調(diào)用了fopen,要用fclose關(guān)閉 ticket文件保存記錄的詳細(xì)信息 printf(文件未找到n); if(count=fopen(count.t*t,w+ )=NULL) /count文件保存記錄的條數(shù) fprintf(count,0); else fscanf(count,%d,&NUM); strcpy(nameofschool,理工學(xué)院開元校區(qū)); G.
34、ve*num=v; /* 初始化構(gòu)造中的景點(diǎn)數(shù)和邊數(shù) */ G.arum=a; for(i=0;i20;+i) G.ve*i.number=i; /* 初始化每一個(gè)景點(diǎn)的編號(hào) */ /* 初始化每一個(gè)景點(diǎn)名及其景點(diǎn)描述 */ strcpy(G.ve*0.sight,大明橋); strcpy(G.ve*0.description,落于小河上,風(fēng)景優(yōu)美); strcpy(G.ve*1.sight,圖書館); strcpy(G.ve*1.description,環(huán)境優(yōu)雅,充滿書香氣息,呈環(huán)形); strcpy(G.ve*2.sight,教學(xué)樓); strcpy(G.ve*2.description,
35、上課和自習(xí)的地方,臨近圖書館); strcpy(G.ve*3.sight,子衿餐廳); strcpy(G.ve*3.description,一餐廳,新裝修過的餐廳,臨近實(shí)驗(yàn)樓,是男女比例最適中的餐廳); strcpy(G.ve*4.sight,實(shí)驗(yàn)A樓); strcpy(G.ve*4.description,教師辦公室); strcpy(G.ve*5.sight,實(shí)驗(yàn)B樓); strcpy(G.ve*5.description,計(jì)算機(jī)機(jī)房); strcpy(G.ve*6.sight,實(shí)驗(yàn)C樓); strcpy(G.ve*6.description,電氣實(shí)驗(yàn)樓); strcpy(G.ve*7.s
36、ight,璞院餐廳); strcpy(G.ve*7.description,第二餐廳,臨近男生宿舍,食物種類比擬多); strcpy(G.ve*8.sight,琇院餐廳); strcpy(G.ve*8.description,第三餐廳,臨近女生宿舍樓,比擬廉價(jià)); /* 這里把所有的邊假定為20000,含義是這兩個(gè)景點(diǎn)之間是不可到達(dá),極大值 */ for(i=0;i20;+i) for(j=0;j20;+j) G.arcsij.adj=Ma*; /* 下邊是可直接到達(dá)的景點(diǎn)間的距離,由于兩個(gè)景點(diǎn)間距離是互相的, 所以要對(duì)圖中對(duì)稱的邊同時(shí)賦值。 */ G.arcs01.adj=G.arcs10.
37、adj=50; G.arcs13.adj=G.arcs31.adj=70; G.arcs06.adj=G.arcs60.adj=250; G.arcs14.adj=G.arcs41.adj=80; G.arcs24.adj=G.arcs42.adj=100; G.arcs35.adj=G.arcs53.adj=90; G.arcs52.adj=G.arcs25.adj=100; G.arcs46.adj=G.arcs64.adj=75; G.arcs47.adj=G.arcs74.adj=300; G.arcs27.adj=G.arcs72.adj=400; G.arcs78.adj=G.ar
38、cs87.adj=40; fwrite(&G,sizeof(MGraph),1,fp); /保存到文件中fclose(fp); /關(guān)閉文件,但不是屏幕fprintf(count,%d,NUM); fclose(count); void narrate() /* 說明函數(shù) */ int i; printf(nt*歡送使用%s校園導(dǎo)游程序*n,nameofschool); printf(t_n); printf(tttt 景點(diǎn)名稱ttttttn); printf(ttt_n); for(i=0;iNUM;i+) if(G.ve*i.number!=-1) printf(tttt%c (%2d)%-
39、10s%cn,3,G.ve*i.number,G.ve*i.sight,3); /* 輸出景點(diǎn)列表 */ printf(ttt_n);void ShortestPath(int num) /* 迪杰斯特拉算法最短路徑函數(shù) num為入口點(diǎn)的編號(hào) */ int v,w,i,t; /* i、w和v為計(jì)數(shù)輔助變量 */ int final20; /* 輔助數(shù)組 */ int min; fp=fopen(guide.t*t,r+); /讀翻開原文件book.t*t count=fopen(count.t*t,r+); /讀寫count文件 for(v=0;vNUM;v+) finalv=0; /* 假設(shè)
40、從頂點(diǎn)num到頂點(diǎn)v沒有最短路徑 */ Dv=G.arcsnumv.adj;/* 將與之相關(guān)的權(quán)值放入D中存放 */ for(w=0;wNUM;w+) /* 設(shè)置為空路徑 */ Pvw=0; if(Dv20000) /* 存在路徑 */ Pvnum=1; /* 存在標(biāo)志置為1 */ Pvv=1; /* 自身到自身 */ Dnum=0; finalnum=1; /* 初始化num頂點(diǎn)屬于S集合 */ /* 開場主循環(huán),每一次求得num到*個(gè)頂點(diǎn)的最短路徑,并將其參加到S集合 */ for(i=0;iNUM;+i) /* 其余G.ve*num-1個(gè)頂點(diǎn) */ min=Ma*; /* 當(dāng)前所知離頂點(diǎn)
41、num的最近距離 */ for(w=0;wNUM;+w) if(!finalw) /* w頂點(diǎn)在v-s中 */ if(Dwmin) /* w頂點(diǎn)離num頂點(diǎn)更近 */ v=w; min=Dw; finalv=1; /* 離num頂點(diǎn)更近的v參加到s集合 */ for(w=0;wNUM;+w) /* 更新當(dāng)前最短路徑極其距離 */ if(!finalw&(min+G.arcsvw.adj)Dw)/* 不在s集合,并且比以前所找到的路徑都短就更新當(dāng)前路徑 */ Dw=min+G.arcsvw.adj; for(t=0;tNUM;t+) Pwt=Pvt; Pww=1; fwrite(&G,sizeo
42、f(MGraph),1,fp); /保存到文件中 fclose(fp); fprintf(count,%d,NUM); fclose(count);void output(int sight1,int sight2) /* 輸出函數(shù) */int a,b,c,d,q=0; a=sight2; /* 將景點(diǎn)二賦值給a */ if(a!=sight1) /* 如果景點(diǎn)二不和景點(diǎn)一輸入重合,則進(jìn)展. */printf(nt從%s到%s的最短路徑是,G.ve*sight1.sight,G.ve*sight2.sight);/* 輸出提示信息 */ printf(t(最短距離為 %dm.)nnt,Da);
43、 /* 輸出sight1到sight2的最短路徑長度,存放在D數(shù)組中 */ printf(t%s,G.ve*sight1.sight); /* 輸出景點(diǎn)一的名稱 */ d=sight1; /* 將景點(diǎn)一的編號(hào)賦值給d */ for(c=0;cNUM;+c) gate:; /* 標(biāo)號(hào),可以作為goto語句跳轉(zhuǎn)的位置 */ Pasight1=0; for(b=0;bNUM;b+) if(G.arcsdb.adj%s,G.ve*b.sight); /* 輸出此節(jié)點(diǎn)的名稱 */ q=q+1; /* 計(jì)數(shù)變量加一,滿8控制輸出時(shí)的換行 */ Pab=0; d=b; /* 將b作為出發(fā)點(diǎn)進(jìn)展下一次循環(huán)輸出
44、,如此反復(fù) */ if(q%8=0) printf(n); goto gate; /*從當(dāng)前位置出發(fā)*/ void Searchpath1(MGraph g)/*查詢兩個(gè)景點(diǎn)間的所有路徑*/int l=0;int k=0;int i,j;fp=fopen(guide.t*t,r+);/讀翻開原文件book.t*tcount=fopen(count.t*t,r+);/讀寫count文件 printf(選擇出發(fā)景點(diǎn):); scanf(%d,&i); printf(選擇目地景點(diǎn):); scanf(%d,&j); for(;kg.ve*num;k+)/*g.ve*number表示網(wǎng)中的頂點(diǎn)個(gè)數(shù)*/ i
45、f(i=g.ve*k.number) i=k;/*在網(wǎng)中找到其編號(hào)與輸入的出發(fā)景點(diǎn)的編號(hào)一樣的頂點(diǎn)*/ for(;lg.ve*num;l+) if(j=g.ve*l.number) j=l;/*在網(wǎng)中找到其編號(hào)與輸入的目地景點(diǎn)的編號(hào)一樣的頂點(diǎn)*/ printf(n從%s到%s的所有游覽路徑有:nn,g.ve*i.sight,g.ve*j.sight);/*輸出出發(fā)景點(diǎn)和目地景點(diǎn)的名稱*/disppath(g,i,j);/*調(diào)用disppath函數(shù),用來輸出兩個(gè)景點(diǎn)間的所有路徑*/ fwrite(&G,sizeof(MGraph),1,fp); /保存到文件中 fclose(fp); fprin
46、tf(count,%d,NUM); fclose(count);void disppath(MGraph g,int i,int j) int k;p0=i; /把i賦給P0,P是一條道路上的所有景點(diǎn)的數(shù)組for(k=0;kg.ve*num;k+)visitedi=0;/*初始化各頂點(diǎn)的標(biāo)志位,即都為未過的*/a=0;/*初始化路徑的條數(shù)*/path(g,i,j,0);/*通過調(diào)用path函數(shù),找到從vi到vj的所有路徑并輸出*/void path(MGraph g,int i,int j,int k)/*確定路徑上第k+1個(gè)頂點(diǎn)的序號(hào)*/int s;if(pk=j)/*找到一條路徑*/a+;
47、/*路徑的條數(shù)值加1*/printf(第%d條:t,a);for(s=0;s);/coutg.ve*ps.sight;printf(%sn,g.ve*ps.sight); s=0; /從第一個(gè)景點(diǎn)開場while(sg.ve*num)if(s!=i)/*保證找到的是簡單路徑*/if(g.arcspks.adj!=Ma*&visiteds=0)/*當(dāng)vk與vs之間有邊存在且vs未被過*/visiteds=1;/*置標(biāo)志位為1,即已的*/pk+1=s;/*將頂點(diǎn)s參加到p數(shù)組中*/ path(g,i,j,k+1);/*遞歸調(diào)用之*/ visiteds=0;/*重置標(biāo)志位為0,即未的,以便該頂點(diǎn)能被重
48、新使用*/s+; int Addnewsight(int n) /添加函數(shù)int i,b;char sight100,description1000;int length; fp=fopen(guide.t*t,r+);/讀翻開原文件book.t*tcount=fopen(count.t*t,r+);/讀寫count文件 printf(請(qǐng)輸入新景點(diǎn)的序號(hào):n);scanf(%d,&b);printf(請(qǐng)輸入新景點(diǎn)的名稱:n);scanf(%s,&sight);printf(請(qǐng)輸入新景點(diǎn)的相關(guān)信息:n);scanf(%s,&description);G.ve*n.number=b;strcpy(
49、G.ve*n.sight,sight); strcpy(G.ve*n.description,description);for(i=0;in;i+) system(cls); narrate();printf(請(qǐng)輸入此景點(diǎn)到第%d個(gè)景點(diǎn)的距離單位:m同一景點(diǎn)或不可到達(dá)用20000表示,極大值:n,i);scanf(%d,&length);if(length!=20000);G.arum+;G.arcsni.adj=G.arcsin.adj=length;NUM+;n+;G.ve*num+; fwrite(&G,sizeof(MGraph),1,fp); /保存到文件中 fclose(fp);
50、fprintf(count,%d,NUM); fclose(count);return n;int Deletesight(int n) /*刪除函數(shù)*/ int i,a=0;int j;int c;int num;char name20;system(cls); fp=fopen(guide.t*t,r+);/讀翻開原文件book.t*tcount=fopen(count.t*t,r+);/讀寫count文件 c=SearchMenu(); switch (c) case 1: system(cls); narrate(); printf(nntt請(qǐng)輸入您要?jiǎng)h除景點(diǎn)的編號(hào):); scanf(
51、%d,&num); for(i=0;iNUM;i+) if(num=G.ve*i.number) /查找到編號(hào) a=1;for(j=0;jNUM;j+)if(G.arcsij.adj!=20000)G.arum-; /如果該頂點(diǎn)與其他頂點(diǎn)間有邊相連,邊數(shù)減一 G.arcsij.adj=G.arcsji.adj=20000; /將該頂點(diǎn)與其他頂點(diǎn)間的距離初始化為無窮大20000) G.ve*num.number=-1; /從要?jiǎng)h除的頂點(diǎn)之后的頂點(diǎn)開場,向前覆蓋 即刪除操作strcmp(G.ve*num.sight,*); strcmp(G.ve*num.description,+); if(a=
52、1) printf(nttt刪除成功!按任意鍵返回.);getchar(); getchar(); if(a=0)printf(該編號(hào)不存在!); getchar(); getchar(); break; case 2: system(cls); narrate(); printf(nntt請(qǐng)輸入您要?jiǎng)h除景點(diǎn)的名稱:); scanf(%s,name); for(i=0;iNUM;i+) if(!strcmp(name,G.ve*i.sight) a=1; num=i; for(j=0;jNUM;j+) if(G.arcsij.adj!=20000) G.arum-;G.arcsij.adj=G.arcsji.adj=20000; G.ve*num.number=-1; /從要?jiǎng)h除的頂點(diǎn)之后的頂點(diǎn)開場,向前覆蓋 即刪除操作 strcmp(G.ve*num.sight,*); strcmp(G.ve*num.description,+); if(a=1) printf(刪除成功!); printf(nttt按任意鍵返回.); getchar()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級(jí)上數(shù)學(xué)教案-三角形的面積練習(xí)課-蘇教版秋
- 三年級(jí)上冊(cè)數(shù)學(xué)教案-1.1 估算兩、三位數(shù)乘一位數(shù)丨蘇教版
- 學(xué)習(xí)2025年雷鋒精神六十二周年主題活動(dòng)實(shí)施方案 (3份)-76
- 蘇教版數(shù)學(xué)三年級(jí)上冊(cè)單元測試卷-第四單元-兩、三位數(shù)除以一位數(shù)含答案
- 人教版三年級(jí)英語上冊(cè)期末測試卷
- 2025年河南省安全員《A證》考試題庫及答案
- 2025遼寧省安全員知識(shí)題庫
- 醫(yī)院鋼結(jié)構(gòu)居間合同范本
- 2025年度城市綜合體車位租賃合同
- 2025年度股權(quán)質(zhì)押合同工商局備案及企業(yè)環(huán)境管理體系認(rèn)證服務(wù)協(xié)議
- 武漢2025年湖北武漢市教育系統(tǒng)專項(xiàng)招聘教師679人筆試歷年參考題庫附帶答案詳解
- 高中主題班會(huì) 借哪吒精神燃開學(xué)斗志!課件-高一下學(xué)期開學(xué)第一課班會(huì)
- 2024年12月2025浙江湖州市長興縣綜合行政執(zhí)法局公開招聘輔助執(zhí)法人員8人筆試歷年典型考題(歷年真題考點(diǎn))解題思路附帶答案詳解
- 《南非綜合簡要介紹》課件
- 2023六年級(jí)數(shù)學(xué)下冊(cè) 第2單元 百分?jǐn)?shù)(二)綜合與實(shí)踐 生活與百分?jǐn)?shù)說課稿 新人教版
- 二零二五年度醫(yī)療援助派駐服務(wù)協(xié)議4篇
- 2024年山東力明科技職業(yè)學(xué)院高職單招語文歷年參考題庫含答案解析
- 《災(zāi)害的概述》課件
- 國產(chǎn)氟塑料流體控制件生產(chǎn)企業(yè)
- 1投影的形成和分類投影的形成投影的分類工程中常用的投影圖28課件講解
- 貨物學(xué) 課件2.1貨物的分類
評(píng)論
0/150
提交評(píng)論