




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上1. 需求分析1.1創(chuàng)建結(jié)點(diǎn)(旅游景點(diǎn))創(chuàng)建該旅游景點(diǎn)是在順序表中完成的,在順序表中,首先要?jiǎng)?chuàng)建結(jié)點(diǎn)結(jié)構(gòu)體,將該結(jié)構(gòu)體命名為SeqList,成員變量有數(shù)組list和size,分別用來表示最大元素個(gè)數(shù)(即旅游景點(diǎn)的最大個(gè)數(shù))和順序表中當(dāng)前存儲(chǔ)的數(shù)據(jù)元素個(gè)數(shù),順序表可以完成的功能有求當(dāng)前數(shù)據(jù)元素個(gè)數(shù),插入數(shù)據(jù)元素,刪除數(shù)據(jù)元素,取數(shù)據(jù)元素。1.2創(chuàng)建圖在構(gòu)造圖的操作中包括結(jié)點(diǎn)的插入(實(shí)參包括AdjMGraph *G,DataTyp v,n,RowColWeight E,e)分別表示在該*G的結(jié)構(gòu)體中的SeqlistVertices中插入結(jié)點(diǎn),在*G的結(jié)構(gòu)體中的edgeMa
2、xVerticesMaxVertices的邊數(shù)組中插入邊信息結(jié)點(diǎn)分別為行下標(biāo)、列下標(biāo)、權(quán)值,該*G的結(jié)構(gòu)體中numOfEdges,e表示邊的條數(shù),即將e的值給它。結(jié)點(diǎn)的順序表初始化,在該函數(shù)中也應(yīng)包括一個(gè)結(jié)構(gòu)體邊信息結(jié)構(gòu)體:成員包括行下標(biāo)、列下標(biāo)、權(quán)值。并將該結(jié)構(gòu)體命名為RowColWeight。1.3圖的實(shí)現(xiàn)在該函數(shù)中要使用SeqList頭文件,在該文件中要真正進(jìn)行插入邊和結(jié)點(diǎn)。首先在該函數(shù)中應(yīng)該定義一個(gè)結(jié)構(gòu)體AdjMGraph,在該結(jié)構(gòu)體的成員變量包括存放結(jié)點(diǎn)的順序表定義為SeqlistVertices、存放邊的鄰接矩陣用edgeMaxVerticesMaxVertices表示,邊的條數(shù)n
3、umOfEdges。初始化AdjMGraph中的成員變量線性表和邊數(shù)及存放邊的鄰接矩陣。然后在順序表中插入結(jié)點(diǎn),在鄰接矩陣中插入邊,刪除邊,刪除結(jié)點(diǎn)。取序號(hào)為V的結(jié)點(diǎn)的第一個(gè)鄰接結(jié)點(diǎn),取序號(hào)為V1的鄰接結(jié)點(diǎn)V2結(jié)點(diǎn)的下一個(gè)鄰接結(jié)點(diǎn)1.4求最短路徑在該函數(shù)中,應(yīng)該有四個(gè)參數(shù),兩個(gè)位輸入?yún)?shù),分別為帶權(quán)圖G和源點(diǎn)(景點(diǎn)起點(diǎn))序號(hào)v0,兩個(gè)為輸出參數(shù),分別為distance和path,distance用來存放達(dá)到的從源點(diǎn)v0到其余各結(jié)點(diǎn)的最短距離,path用來存放最短路徑的下標(biāo)。1、從江西農(nóng)業(yè)大學(xué)的平面地圖中選取出6個(gè)有代表性的景點(diǎn)。2、為來訪的客人提供圖中任意景點(diǎn)的路徑查詢,即查詢?nèi)我鈨蓚€(gè)景點(diǎn)之間
4、的最短簡單路徑。當(dāng)用戶輸入正確時(shí),為用戶輸出任意兩景點(diǎn)的最短路徑;當(dāng)用戶輸入不合法時(shí),提示用戶輸入有誤并返回讓用戶重新輸入。3、為來訪客人推薦參觀最短路線。2.概要設(shè)計(jì)1首先用鄰接矩陣存儲(chǔ)校園圖。2用數(shù)據(jù)結(jié)構(gòu)知識(shí)創(chuàng)建校園圖。3手動(dòng)給校園圖賦上相關(guān)信息(景點(diǎn)名稱、代號(hào)、簡介),路徑及路徑長度。4利用C語言知識(shí)編寫查找景點(diǎn)相關(guān)信息的程序。5利用迪杰斯特拉算法計(jì)算任意兩點(diǎn)之間的最短路徑。6最后用一個(gè)主函數(shù)main輸出各項(xiàng)結(jié)果。1創(chuàng)建校園圖:(1)先定義節(jié)點(diǎn)個(gè)數(shù)N,邊的最大值(Maxweight),節(jié)點(diǎn)(景點(diǎn)名稱、景點(diǎn)信息),鄰接點(diǎn),邊,頂點(diǎn)向量,當(dāng)前頂點(diǎn)數(shù)和邊數(shù)。 (2)先給一個(gè)節(jié)點(diǎn)賦上其相關(guān)信息,
5、然后再用p = (Node)malloc(sizeof(edgenode)語句申請(qǐng)下一結(jié)點(diǎn),再給所申請(qǐng)的節(jié)點(diǎn)賦上相關(guān)信息,直到節(jié)點(diǎn)數(shù)為N=6為止。 (3)讀入道路的起始點(diǎn),為鄰接矩陣的邊賦相應(yīng)的值。時(shí) (4)節(jié)點(diǎn)和邊的相關(guān)信息都弄好了后,校園圖也就創(chuàng)建好了。 2利用函數(shù)Name給10個(gè)節(jié)點(diǎn)賦上相應(yīng)的名稱,利用函數(shù)Information給各節(jié)點(diǎn)添加相應(yīng)的介紹信息。 3利用函數(shù)travgraph來查找景點(diǎn)信息,要查找景點(diǎn)名稱時(shí)調(diào)用Name函數(shù),要查找景點(diǎn)介紹信息時(shí)調(diào)用Information函數(shù)。 4手動(dòng)創(chuàng)建一個(gè)校園圖AdjMGraphgcreat(AdjMGgrph *G),然后為相應(yīng)的邊賦上真正
6、的值。 5用distance數(shù)組來存放任意兩景點(diǎn)之間的最短路徑。 6用main函數(shù)來輸出結(jié)果:用switch語句分別輸出,要?jiǎng)?chuàng)建校園圖時(shí)調(diào)用AdjMGraphgraphcreat函數(shù);查找景點(diǎn)相關(guān)信息時(shí)調(diào)用search函數(shù);要查找任意兩景點(diǎn)之間的最短路徑時(shí),先輸入你目前所在的位置,再輸入你的目的地,最后調(diào)用path函數(shù)。3. 詳細(xì)設(shè)計(jì)#define N 10#define MAXSize 20 /圖中頂點(diǎn)數(shù)的最大值#define MAXedg 30 /圖中邊數(shù)的最大值 #include <stdio.h>#include <string.h>#include <s
7、tdlib.h>#include <conio.h>typedef int AdjMGraph MAXSize MAXSize;/存放鄰接矩陣的權(quán)值信息 typedef structint vexs MAXSize; AdjMGraph s;/Matrix_Graph;/圖的鄰接矩陣表示法。typedef struct numofedge/int adjvex; /鄰接矩陣結(jié)點(diǎn)序號(hào)int length; /定義道路長度char info10; /定義景點(diǎn)名稱char info2100; /定義景點(diǎn)詳細(xì)信息struct numofedge *next;/定義指向下一個(gè)結(jié)點(diǎn)的指針
8、 numofedge, *Node ;/將該結(jié)構(gòu)體重新命名為*Node typedef structchar name10; /存儲(chǔ)景點(diǎn)的名稱數(shù)組 char information100; /具體的介紹此景點(diǎn)信息數(shù)組 struct numofedge *link; /指向下一個(gè)景點(diǎn)的指針 vextices; /創(chuàng)建景點(diǎn)及其信息結(jié)構(gòu)體 typedef struct Edgeint lengh; /邊的權(quán)值,表示路徑長度.int ivex, jvex; /表示兩個(gè)連接的結(jié)點(diǎn)的位置變量 struct Edge *next; /指向下一條邊的指針變量 EdgeType; /邊及其信息.typedef
9、struct int num; /結(jié)點(diǎn)編號(hào)。char name10; /結(jié)點(diǎn)名稱 vertex;/存放結(jié)點(diǎn)信息結(jié)構(gòu)體 typedef structvertex vexs MAXSize; /存放結(jié)點(diǎn)數(shù)組元素信息 int edges MAXSize MAXSize; /存放邊的鄰接矩陣 adjmax,adj; /表示圖的結(jié)構(gòu)體 FILE *fp; /文件的讀取void clrscr() /清屏system("cls");void creatgraph(vextices g,int *n, EdgeType e,adjmax *adj) /創(chuàng)建校園圖vextices g表示存放
10、景點(diǎn)信息數(shù)組 ,n表示下一個(gè)景點(diǎn),EdgeType e表示存放邊的信息數(shù)組,adjmax *adj表示下一條邊的信息數(shù)組 int b,i,s,d,len;/b代表結(jié)點(diǎn)之間的邊數(shù) struct numofedge *p,*q; /定義圖的結(jié)構(gòu)體 if(fp = fopen("file.txt","r") = NULL) /打開文件,對(duì)文件進(jìn)行讀的操作 printf("文件打開錯(cuò)誤!n");getchar();/獲取景點(diǎn)信息 exit(0);fscanf(fp,"%d %dn",n,&b); /讀入景點(diǎn)個(gè)數(shù)和邊
11、數(shù)for(i = 1; i <= *n; i+) fscanf(fp,"%s %sn",&,&rmation);/讀入文件中結(jié)點(diǎn)(景點(diǎn))的名字和詳細(xì)介紹信息 strcpy(adj->,);/將景點(diǎn)的名字賦給圖中的結(jié)點(diǎn)信息 gi.link = NULL; /初始化節(jié)點(diǎn)的下一個(gè)結(jié)點(diǎn)信息 for(i = 1; i <= b; i+) fscanf(fp,"%d %d %dn",&ei.lengh,&ei.ivex,&ei.jvex); /讀入
12、道路長度和邊的行下標(biāo)和列下標(biāo) s = ei.ivex; /將邊的行號(hào)記錄給S,將邊的列號(hào)記錄下來。d = ei.jvex;len = ei.lengh;/將各個(gè)邊的長度值記錄下來 adj->edgessd = ei.lengh; /為鄰接矩陣中相應(yīng)的邊賦值adj->edgesds = ei.lengh;/該矩陣為對(duì)稱矩陣故 edgesds=edgessd; p = (Node)malloc(sizeof(numofedge); /為一個(gè)新的結(jié)點(diǎn)開辟動(dòng)態(tài)空間。p->next = NULL;/初始化開辟空間的下一個(gè)結(jié)點(diǎn) q = (Node)malloc(sizeof(numofe
13、dge);/為一個(gè)新的結(jié)點(diǎn)開辟動(dòng)態(tài)空間q->next = NULL;/初始化開辟空間的下一個(gè)結(jié)點(diǎn) p->adjvex = d; / 將邊的列號(hào)給結(jié)點(diǎn)信息的結(jié)構(gòu)體中記錄鄰接矩陣的序號(hào)成員 p->length = len;/將邊的長度值給結(jié)點(diǎn)信息的結(jié)構(gòu)體中的道路成員 strcpy(p->info,); /為景點(diǎn)賦名稱strcpy(p->info2,rmation); /為景點(diǎn)賦介紹信息q->adjvex = s; / 為景點(diǎn)賦序號(hào),道路長度 q->length = len;strcpy(q->info,);
14、/為景點(diǎn)賦名稱strcpy(q->info2,rmation); /為景點(diǎn)賦介紹信息p->next = gs.link; /使p指針指向第s行的下一行,頭插法建立鄰接表gs.link = p;/使p指針指向第s行的下一行的下一行 q->next = gd.link;/使q指針指向第d列的下一列,頭插法建立鄰接表gd.link = q;/使q指針指向第d列的下一列,頭插法建立鄰接表printf("校園旅游圖已經(jīng)建立!n");getchar(); void Name(int i)switch(i)/為景點(diǎn)添加具體的名字地點(diǎn) case 1: pri
15、ntf("1:一教n");break;case 2: printf("2:二教n");break; case 3: printf("3:五教n");break; case 4: printf("4:新圖書館n");break; case 5: printf("5:老圖書館n");break; case 6:printf("6:北區(qū)食堂n");break; case 7: printf("7:南區(qū)食堂n");break; case 8: printf(&qu
16、ot;8:大學(xué)生活動(dòng)中心n");break; case 9: printf("9:圓形報(bào)告廳n");break; case 10: printf("10: 體育館n");break; default:printf("景點(diǎn)編號(hào)輸入錯(cuò)誤!請(qǐng)輸入1->10的數(shù)字編號(hào)!nn"); break; /*Name*/void Information(int i)/*景點(diǎn)介紹*/ switch(i)/為景點(diǎn)添加介紹信息 case 1: printf("一教:這是一棟比較古老的建筑樓,但是當(dāng)你路過這里,會(huì)聽到朗朗的讀書聲,很勵(lì)
17、志的地方n");break;case 2: printf("二教: 這棟樓真的很令人不滿意,不看平面圖很難找到,其次,它就是一個(gè)2的形狀n");break; case 3: printf("五教: 這棟教學(xué)樓應(yīng)該是新建的,總體看上去還令人比較滿意,周邊環(huán)境也挺好的n");break; case 4: printf("新圖書館:雖然很小,但是還過的去,學(xué)習(xí)環(huán)境很好,還有自修室,閱覽室等學(xué)習(xí)場所 n");break; case 5: printf("老圖書館:很少去,聽說藏的書一般是藝術(shù)類的書籍,建筑學(xué),美術(shù)還有音樂方
18、面等書籍n");break; case 6:printf("北區(qū)食堂: 有時(shí)候味道太重,太咸,但是平時(shí)味道不錯(cuò),是學(xué)生就餐的主要餐廳。nn");break; case 7: printf("南區(qū)食堂: 味道偏清淡,三樓的南昌風(fēng)味的快餐店味道較好n");break; case 8: printf("大學(xué)生活動(dòng)中心:在體育館旁邊,舉辦活動(dòng)的主要場所,每次晚上路過那里都會(huì)聽到在舉辦活動(dòng),很熱鬧n");break; case 9: printf("圓形報(bào)告廳: 太小了,如果要求全院的人都參加專業(yè)類的報(bào)告,則會(huì)有很多晚來的人
19、站在后面,沒有足夠的座位n");break; case 10: printf("體育館: 上體育課的主要場地,比較空曠,平時(shí)會(huì)有很多學(xué)生在那里訓(xùn)練,打羽毛球的時(shí)候和練輪滑的時(shí)候最精彩了n");break; default:printf("景點(diǎn)編號(hào)輸入錯(cuò)誤!請(qǐng)輸入1->10的數(shù)字編號(hào)!nn"); break; /*Information*/void searchgraph(vextices g,int n,adjmax adj) /1查找指定景點(diǎn)信息int i = 1,flag = 1,len; /len存儲(chǔ)要查詢的景點(diǎn)的序號(hào)char ch
20、;printf("請(qǐng)輸入您要查詢的景點(diǎn)序號(hào):n");/提示用戶輸入景點(diǎn)序號(hào) scanf("%d",&len);getchar();/獲取該序號(hào)對(duì)應(yīng)的景點(diǎn)名稱和景點(diǎn)信息 printf("此景點(diǎn)的名稱是:");Name(len);printf("此景點(diǎn)的介紹是:");Information(len);doprintf("是否繼續(xù)? Y/N");scanf("%c",&ch);getchar();if(ch = 'Y' | ch = 'y
21、39;) /繼續(xù)flag = 1;i = 1;printf("請(qǐng)輸入您要查詢的景點(diǎn)序號(hào):n");scanf("%d",&len);getchar();printf("此景點(diǎn)的名稱是:");Name(len);printf("此景點(diǎn)的介紹是:");Information(len);continue ;elseflag = 0; /不繼續(xù)break;while(1);void creat(Matrix_Graph *G)int i,j;for(i=1;i<=N;i+) G->vexsi=i;/初始化
22、,0號(hào)位不用。for(i=1;i<=N;i+)for(j=1;j<=N;j+) G->sij=0;/初始值為0。G->s12=2;G->s19=5;/表示景點(diǎn)一到景點(diǎn)二的距離是2。G->s21=2;G->s23=5;G->s24=4;G->s29=6;/將景點(diǎn)間的距離初始化 G->s32=5;G->s34=7;G->s37=5;G->s39=6;G->s310=6;G->s42=4;G->s46=7;G->s410=7;G->s56=4;G->s57=6;G->s58=8;G
23、->s64=7;G->s65=4;G->s67=3;G->s610=7;G->s76=3;G->s78=4;G->s710=6;G->s85=8;G->s87=4;G->s89=9;G->s91=5;G->s92=6;G->s93=6;G->s98=9;G->s103=6;G->s104=7;G->s106=7;G->s107=6;for(i=1;i<=N;i+)for(j=1;j<=N;j+)if(G->sij=0) G->sij= MAXSize;/沒有被重新
24、賦值的,表示兩景點(diǎn)之間/沒有路,用MAX表示無窮大。void Mindistance(Matrix_Graph *G,int s,int e)int i,j,u,c=1,t,v;int rN+1N+1;/用來存放路徑上的景點(diǎn)。int TN,flagN,dN;for(i=0;i<=N;i+)for(j=0;j<=N;j+) rij=0;/初始值為0。for(i=1;i<=N;i+)Ti=-1;/初始值為-1。flagi=1;/初始值為1。di= MAXSize;/路徑長度初始值為無窮大,用MAX表示。flags=0;/修改標(biāo)識(shí)。while(c<=N)t= MAXSize;
25、for(i=1;i<=N;i+)if(flagi&&G->ssi<t)/求最短路徑,求從起點(diǎn)到終點(diǎn)的所有距離加起來的最短路徑 t=G->ssi;v=i;rv1=v;for(i=1;i<=c;i+)for(j=1;j<=N;j+)if(flagj&&di+G->sTij<t) t=di+G->sTij;v=j;if(rv0!=-1)u=1;while(rTiu!=0)rvu=rTiu;u+;rvu=v;rv0=-1;Tc=v;flagv=0;dc=t;c+;printf("nThe path is:n
26、(%d)",s);j=1;while(rej!=0)printf("->(%d)",rej);j+;/顯示路徑。printf("nn");int main()/主函數(shù)int i,j;Matrix_Graph G;creat(&G);int n = 0; /景點(diǎn)數(shù)目 vextices g MAXSize; /1保存頂點(diǎn)及其信息EdgeType eMAXedg; /保存邊及其信息adjmax adj; /保存邊和定點(diǎn)char choice = 'x'while(1)clrscr();printf("nnttt
27、*校園導(dǎo)游系統(tǒng)*nn");/提示用戶正確根據(jù)需要輸入數(shù)字 printf("ttt1. 文件讀入并創(chuàng)建校園圖:nn");printf("ttt2. 查詢景點(diǎn)詳細(xì)信息:nn");printf("ttt3. 查找兩景點(diǎn)間最短路徑:nn");printf("ttt0. 退出nn");printf("Please enter your choice(0-3):n ");choice = getchar();switch(choice)case '1':clrscr();creat
28、graph(g,&n,e,&adj); /創(chuàng)建圖(景點(diǎn),景點(diǎn)數(shù),邊,邊和景點(diǎn))printf("n打開文件錯(cuò)誤n");getchar();break;case '2':clrscr();searchgraph(g,n,adj);/查詢景點(diǎn)信息getchar(); break;case '3':clrscr();printf("2你目前的位置是:n");scanf("%d",&i);getchar();printf("2你的目的地是:n");scanf("
29、;%d",&j);getchar();Mindistance(&G,i,j);/查找最短路徑getchar();creat(&G);doprintf("是否繼續(xù)? Y/N");char ch;int flag=1;scanf("%c",&ch);getchar();if(ch = 'Y' | ch = 'y') /是否繼續(xù)flag = 1;i = 1;printf("2你目前的位置是:n");scanf("%d",&i);getcha
30、r();/獲取輸入的數(shù)字對(duì)應(yīng)的地點(diǎn) printf("2你的目的地是:n");scanf("%d",&j);getchar();Mindistance(&G,i,j);/查找最短路徑getchar();creat(&G);continue ;elseflag = 0; /不繼續(xù)break;while(1);break;case '0': clrscr();printf("n*按任意鍵退出*n");getchar();exit(0);break;default:printf("n輸入錯(cuò)誤,請(qǐng)重新輸入0-3之間的數(shù)字:n");getchar(); break; getchar();4. 調(diào)試分析4.1測(cè)試數(shù)據(jù)當(dāng)起點(diǎn)輸入11終點(diǎn)輸入10時(shí),景點(diǎn)不存在,程序提示重新輸入;當(dāng)起點(diǎn)輸入0(教學(xué)主樓)終點(diǎn)輸入10時(shí),終點(diǎn)景點(diǎn)不存在,程序提示重新輸入;當(dāng)起點(diǎn)輸入3(五教)終點(diǎn)輸入4(新圖書館)時(shí),景點(diǎn)都存在,屏幕打印出兩景點(diǎn)最短路徑:五教新圖書館,最短路徑約為6。當(dāng)輸入1時(shí),則按景點(diǎn)編號(hào)查詢,當(dāng)輸入6(北區(qū)食堂)
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 醫(yī)藥股份面試題及答案
- 綠色生態(tài)停車場產(chǎn)權(quán)交易及維護(hù)服務(wù)合同
- 2026版《全品高考》選考復(fù)習(xí)方案生物22 15.1自由組合定律 含答案
- 廚房物資采購方案
- 企業(yè)商業(yè)秘密保護(hù)課件
- 庫房整修改造方案
- 校內(nèi)競聘面試題及答案
- 世界地圖考試題及答案
- 運(yùn)城聯(lián)考試題及答案
- 陽臺(tái)吊籃補(bǔ)修方案
- 2025年駕駛?cè)y(cè)試題及答案
- 2025年法律常識(shí)題庫及答案【典優(yōu)】
- 暴雨天氣的應(yīng)急措施
- 光伏電站安全培訓(xùn)課件
- 網(wǎng)絡(luò)與信息安全專業(yè)國家技能人才培養(yǎng)工學(xué)一體化課程標(biāo)準(zhǔn)
- 【MOOC】《電子技術(shù)實(shí)習(xí)SPOC》(北京科技大學(xué))中國大學(xué)MOOC慕課答案
- 銀行貸款合同書范本示例
- 鞋廠品質(zhì)管理
- 2025年新高考語文模擬考試試卷(五) (含答案解析)
- 中國共產(chǎn)主義青年團(tuán)團(tuán)章
- GB/T 1796.2-2024輪胎氣門嘴第2部分:膠座氣門嘴
評(píng)論
0/150
提交評(píng)論