版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 課程: 算法與數(shù)據(jù)結(jié)構(gòu) </p><p> 最短路徑--拯救007課程設(shè)計</p><p> 系 電子信息與計算機科學(xué)系 </p><p> 專業(yè) 計算機科學(xué)與技術(shù) </p><p> 班級 **** </p><p> 姓名 ***
2、** </p><p> 學(xué)號 ******* * </p><p> 任課教師 </p><p> 學(xué)年學(xué)期 學(xué)期 </p><p><b> 任務(wù)分配: </b></p>
3、;<p><b> ·程序員:*。</b></p><p> 主要任務(wù):負(fù)責(zé)算法的設(shè)計,并完成源代碼的編寫。</p><p><b> ·測試員:*。</b></p><p> 主要任務(wù):負(fù)責(zé)設(shè)計測試用程序,并對實驗結(jié)果進行整理分析,最后完成實驗報告的第三、第四部分內(nèi)容,即測試結(jié)果
4、與分析探討部分。</p><p><b> ·文檔員:*。</b></p><p> 主要任務(wù):負(fù)責(zé)撰寫實驗報告的第一、第二部分內(nèi)容,即實驗內(nèi)容簡介與算法描述。同時完成整個文檔的整合,使整篇報告排版、文字風(fēng)格統(tǒng)一。</p><p><b> 一、簡介</b></p><p> 看過
5、 007 系列的電影的人們一定很熟悉 Jams Bond 這個世界上最著名的特工了。在電影“Live And Let Die”中 Jams Bond 被一組毒品販子抓住并關(guān)到湖中心的一個小島上,而湖中有很多兇猛的鱷魚。這時 Jams Bond 做出了——他跳到了最近的鱷魚的頭上,在鱷魚還沒有反映過來的時候,跳到另一支鱷魚的頭上……最后終于安全地跳到 了湖岸上。 假設(shè)湖是100*100 的正方形,設(shè)湖的中心在(0,0),湖的東北角的坐標(biāo)是
6、(50,50)。湖中心的圓環(huán)小島的圓心在(0,0),直徑是15,一些兇殘的鱷魚分布在湖中不同的位置。現(xiàn)已知的湖中的鱷魚的位置和 Jams Bond 可以跳的最大距離,請你告訴 Jams Bondyitiao 最短的到達湖邊的路徑。他逃出去的路徑長度等于他跳的次數(shù)。</p><p> 其中最短路徑說的是在一個無權(quán)圖中,若從一個頂點到另一個頂點存在著一條路徑,則稱該條路徑長度為該路徑上所有經(jīng)過的邊的數(shù)目,它也等于該
7、路徑上的頂點數(shù)減1。由于從一個頂點到另一個頂點可能存在著多條路徑,在每條路徑上所經(jīng)過的邊數(shù)可能不同,把路徑長度最短(經(jīng)過的邊數(shù)最少)的那條路徑叫做最短路徑,其路徑長度叫做最短距離。若圖是帯權(quán)圖,則把從一個頂點 vi 到 vj 的一條路徑上所有經(jīng)過邊的權(quán)值之和定義為該路徑的帶權(quán)路徑長度。把帶權(quán)路徑長度最短的那條路徑稱為該有權(quán)圖的最短路徑,其路徑長度稱為最短距離。如何求解從一個頂點到其余每個頂點的最短路徑呢?狄克斯特拉于1959 年提出了解
8、決此問題的一種按路徑長度的遞增次序產(chǎn)生最短路徑的算法。其基本思想是,從圖中給定源點到其他各個頂點之間客觀上應(yīng)個存在一條最短路徑,在這組最短路徑中,按其長度的遞增次序求出到不同頂點的最短路徑和路徑長度。</p><p> 另外上文提到的圖是一種較線性結(jié)構(gòu)和樹形結(jié)構(gòu)更為復(fù)雜的非線性數(shù)據(jù)結(jié)構(gòu),這種復(fù)雜性主要來自數(shù)據(jù)元素之間的復(fù)雜關(guān)系。在圖結(jié)構(gòu)中,任何兩個數(shù)據(jù)元素之間都可能存在關(guān)系,一般用頂點表示數(shù)據(jù)元素,而用頂點之間
9、的連線表示數(shù)據(jù)元素之間的關(guān)系。圖的二元組定義為:G=(V,E)。其中V 是非空的頂點集合,E 是V 上的二元關(guān)系集合。</p><p><b> 二、算法說明</b></p><p> 2.1輸入、輸出要求</p><p> 輸入要求: 程序從“input.txt”文件中讀取輸入信息,這個文件包含了多組輸入數(shù)據(jù)。 每組輸入數(shù)據(jù)的起始行中包
10、含了兩個整數(shù)n 和d,n 是鱷魚的數(shù)量而且n<=100, d 是007 可以跳的最大距離而且d>0。起始行下面的每一行是鱷魚的坐標(biāo)(x,y), 其中x,y 都是整數(shù),而且沒有任何兩只鱷魚出現(xiàn)在同一位置。Input.txt 文件以 一個負(fù)數(shù)結(jié)尾。</p><p> 輸出要求: 程序結(jié)果輸出到output.txt 文件中。對于每組輸入數(shù)據(jù),如果007 可以逃 脫,則輸出到output.txt 文件的內(nèi)容
11、格式如下:第一行是007 必須跳的最小步 數(shù),然后按照跳出順序記錄跳出路徑上的鱷魚坐標(biāo)(x,y),每行一個坐標(biāo)。如果007 不可能跳出去,則將-1 寫入文件。如果這里有很多個最短路徑,只需輸 入其中的任意一種。</p><p> 2.2所用算法和重要的數(shù)據(jù)結(jié)構(gòu)</p><p> 首先可定義為如下結(jié)構(gòu),記錄007 跳過的路徑。</p><p> typedef
12、unsigned int Vertez; </p><p> typedef double Distance; </p><p> typedef struct GraphNodeRecord{ </p><p> int X; /*x 軸坐標(biāo)*/ </p><p> int Y;
13、 /*y 軸坐標(biāo)*/ </p><p> unsigned int Step; /*記錄到本節(jié)點一共跳了多少步*/ </p><p> Vertex Path; /*指向本節(jié)點的父節(jié)點,即跳到本節(jié)點之間007 所在節(jié)點*/</p><p> }GraphNode; </p><p> type
14、def GraphNode*Grapha;</p><p> 其次尋找跳出路徑可通過應(yīng)用隊列對圖進行廣度搜索,讀出一組測試數(shù)據(jù)返回007 跳過的路徑Graph,*Bank尋找到岸邊的最短路徑,其中入隊列與出隊列函數(shù)分別是Inject()和Pop() ,在執(zhí)行完算法read_case 后,*Bank 值可能如下3 種可能:</p><p> (1)-1,意味著007 無法逃脫出去;<
15、;/p><p> ?。?)1 ,意味著007 可以直接從島上跳出去,而不用經(jīng)過鱷魚的腦袋;</p><p> ?。?)k ,返回的第 k 點是 007 經(jīng)過最短路徑逃出鱷魚潭是經(jīng)過的最后一個頂點。可以根據(jù)G[k]的path 參數(shù)來追蹤該點的上一點,由此類推可以得到007 逃脫的最短路徑。</p><p> 上文提到的廣度優(yōu)先算法(Breadth-First-Searc
16、h),又稱作寬度優(yōu)先搜索,或橫向優(yōu)先搜索,簡稱BFS,是一種圖形搜索演算法。簡單的說,BFS是從根節(jié)點開始,沿著樹的寬度遍歷樹的節(jié)點,如果發(fā)現(xiàn)目標(biāo),則演算終止。BFS是一種盲目搜尋法,目的是系統(tǒng)地展開并檢查圖中的所有節(jié)點,以找尋結(jié)果。換句話說,它并不考慮結(jié)果的可能位址,徹底地搜索整張圖,直到找到結(jié)果為止。BFS并不使用經(jīng)驗法則算法。從算法的觀點,所有因為展開節(jié)點而得到的子節(jié)點都會被加進一個先進先出的佇列中。一般的實作里,其鄰居節(jié)點尚未被
17、檢驗過的節(jié)點會被放置在一個被稱為open的容器中(例如佇列或是鏈表),而被檢驗過的節(jié)點則被放置在被稱為closed的容器中。首先將根節(jié)點放入佇列中。從佇列中取出第一個節(jié)點,并檢驗它是否為目標(biāo)。 如果找到目標(biāo),則結(jié)束搜尋并回傳結(jié)果。否則將它所有尚未檢驗過的直接子節(jié)點加入佇列中。若佇列為空,表示整張圖都檢查過了——亦即圖中沒有欲搜尋的目標(biāo)。結(jié)束搜尋并回傳“找不到目標(biāo)”。重復(fù)步驟2。廣度優(yōu)先搜索的實現(xiàn)一般采用open-closed表。廣度優(yōu)先
18、搜索算法具有完全性。這意指無論圖形的種類如何,只要目標(biāo)存在</p><p> 2.3算法和數(shù)據(jù)結(jié)構(gòu)程序流程圖</p><p><b> 三、測試結(jié)果</b></p><p> 測試數(shù)據(jù)分為5類,分別為:007步長很大,以至于可以直接跳出;007無法跳出;一般情況;復(fù)雜情況(即最短路徑有多條);非法輸入。</p><p&
19、gt; 1.復(fù)雜情況(最短路徑有多條)</p><p><b> 2.007無法跳出</b></p><p> 3.007步長很大,以至于可以直接跳出</p><p><b> 4.一般情況</b></p><p><b> 5.非法輸入</b></p>
20、<p><b> 四、分析與探討</b></p><p><b> 4.1測試結(jié)果分析</b></p><p> 1.明確題目中的已知條件 </p><p> (1)007被關(guān)的小島在湖的中心; </p><p> (2)小島是圓形,圓心在(0,0),而且直
21、徑是15; </p><p> (3)沒有兩只鱷魚在同一個位置; </p><p> (4)鱷魚的坐標(biāo)值都是整數(shù)。 </p><p> 2.一些判斷007是否能跳出的細(xì)節(jié) </p><p> (1)判斷007是否能夠直接從島上跳到湖岸:</p><p> 由已知條件可得
22、,湖是一個正方形,邊長為100,中心是在(0,0),四個頂點分別是(50,50),(50,-50),(-50,-50),(-50,50)。而湖中小島的直徑是15.所以如果007可以跳大于等于(50-15/2)=42.5,他就可以直接從小島跳到湖岸,而不用經(jīng)過鱷魚。 </p><p> (2)判斷007是否能夠直接從島上跳到湖中點A:</p><p> 已知半徑是7.5,假設(shè)點
23、A的坐標(biāo)是(x,y),007的步長是L,則當(dāng)點A到中心(0,0)的距離小于等于007的步長加上小島的半徑7.5的時候就能確定007可以從島上跳到點A,即:x*x+y*y<=(L+7.5)*(L+7.5)。 </p><p> (3)判斷007是否能夠從點A跳到點B:</p><p> 假設(shè)007的步長是L所以如果兩點之間的距離小于等于L,則判斷007可以從A跳到B,即(
24、A.x-B.x)^2+(A.y-B.y)^2<=L*L;其他情況時007不能從A點跳到B點。 </p><p> (4)判斷007是否能夠從點A跳到湖岸:</p><p> 當(dāng)從A點到湖岸的距離小于等于007的步長的時候,說明他可以從A點跳到湖岸,|A.x|+L>=50或|A.y|+L>=50;其他情況時007不能從A點跳到湖岸。</p>&l
25、t;p><b> 4.2探討與改進</b></p><p> 測試輸入情況分為007步長很大,以至于可以直接跳出,007無法跳出,一般情況,復(fù)雜情況(即最短路徑有多條)和非法輸入5種情況。</p><p> 輸出結(jié)果為-1表示未跳出,輸出結(jié)果為整數(shù)表示007跳出來所跳的步數(shù),整數(shù)后面跟有坐標(biāo)表示007跳出去所經(jīng)過的坐標(biāo)</p><p&g
26、t; 對于非法輸入,輸出結(jié)果為-1,還需改進,應(yīng)輸出“您輸入的數(shù)據(jù)有誤”等提示。</p><p><b> 附錄 源代碼</b></p><p> #include "Graph.h"</p><p> #include "Deque.h"</p><p> #inclu
27、de "error.h"</p><p> #include <stdlib.h></p><p> #include <stdio.h></p><p> /******讀入一個case返回一個Graph,*Bank 記錄最短到達河岸的路徑******/</p><p> Graph re
28、ad_case(FILE *InFile, int num, Vertex* Bank, Deque D)</p><p><b> {</b></p><p> Graph G = NULL;</p><p> Distance JamesJump;</p><p><b> Vertex V;<
29、;/b></p><p><b> int x, y;</b></p><p> int i, Times;</p><p> *Bank = 0;</p><p> fscanf(InFile, "%lf", &JamesJump);</p><p>
30、 if(CheckForEnd(0, 0, JamesJump + ISLAND_DIAMETER/2.0))</p><p><b> {</b></p><p> for(i = 0; i < (num << 1); i++) /*一步便跳出的情況 */</p><p> fscanf(InFile, "
31、;%d", &x);</p><p> *Bank = 1;</p><p><b> }</b></p><p> else if(num > 0) /* 007必須經(jīng)過鱷魚頭上的情況 */</p><p><b> {</b>&
32、lt;/p><p><b> num += 2;</b></p><p> G = GraphNew(num);</p><p> for(i = 2; i < num; i++) /* 第三個node開始是鱷魚 */</p><p><b> {</b></p&
33、gt;<p> fscanf(InFile, "%d", &x);</p><p> fscanf(InFile, "%d", &y);</p><p> G[i].X = x;</p><p> G[i].Y = y;</p><p> if(CheckForS
34、tart(x, y, JamesJump)) /*判斷是否能跳上該點*/</p><p><b> {</b></p><p> G[i].Path = 1; /*007可以跳到 */</p><p> G[i].Step = 1; /* 一步 */</p><
35、;p> if(CheckForEnd(x, y, JamesJump)) /* 判斷該點是否能跳出 */</p><p><b> {</b></p><p> *Bank = i; /* 007可以跳出 */</p><p> Times = (num - i - 1) << 1;<
36、;/p><p> for(i = 0; i < Times; i++) /* 不必檢驗其他鱷魚 */</p><p> fscanf(InFile, "%d", &y);</p><p> DequeClear(D);</p><p><b> break;</b>&
37、lt;/p><p><b> }</b></p><p><b> else</b></p><p> Inject(i, D); /* 插入該點,并開始下一個檢測 */</p><p><b> }</b></p><p&g
38、t;<b> }</b></p><p> while(!IsEmpty(D)) /*只經(jīng)過一個鱷魚無法跳出,必須還要跳到其它鱷魚的情況 */</p><p><b> {</b></p><p> V = Pop(D);</p><p> for(i = 2; i < num
39、; i++) /* 從這只鱷魚跳到其他各個鱷魚 */</p><p><b> {</b></p><p> if((G[i].Step > G[V].Step + 1)</p><p> && CheckForConnect(G, V, i, JamesJump))</p><p
40、><b> {</b></p><p> G[i].Path = V;</p><p> G[i].Step = G[V].Step + 1;</p><p> if((G[i].Step < G[*Bank].Step)</p><p> && CheckForEnd(G[i].
41、X, G[i].Y, JamesJump))</p><p> *Bank = i;</p><p><b> else</b></p><p> Inject(i, D);</p><p><b> }</b></p><p><b> }&l
42、t;/b></p><p><b> }</b></p><p><b> }</b></p><p><b> return G;</b></p><p><b> }</b></p><p> /******寫出
43、結(jié)果,即最短路徑******/</p><p> void write_result(FILE *OutFile, Vertex Bank, Graph G, Deque D)</p><p><b> {</b></p><p> unsigned int Times, i;</p><p><b>
44、 Vertex V;</b></p><p> switch(Bank){</p><p> case 0: /* 007無法跳出 */</p><p> fprintf(OutFile, "%d\n", -1);</p><p><b> break;</b>&
45、lt;/p><p> case 1: /* 007可以直接跳出 */</p><p> fprintf(OutFile, "%d\n", 1);</p><p><b> break;</b></p><p> default: </p><
46、;p> Times = G[Bank].Step + 1;/* 跳的步數(shù) */</p><p> while(Bank != 1)/* 跟蹤路徑 */</p><p><b> {</b></p><p> Push(Bank, D);</p><p> Bank = G[Bank].Path;&
47、lt;/p><p><b> }</b></p><p> fprintf(OutFile, "%d\n", Times);/* 輸出 */</p><p> for(i = 1; i < Times; i++)</p><p><b> {</b></p>
48、;<p> V = Pop(D);</p><p> fprintf(OutFile, "%d ", G[V].X);</p><p> fprintf(OutFile, "%d\n", G[V].Y);</p><p><b> }</b></p><p>
49、<b> }</b></p><p><b> }</b></p><p> int main(int argc, char *argv[])</p><p><b> {</b></p><p> FILE *in, *out;</p><p&
50、gt;<b> Deque D;</b></p><p> int VertexNum;</p><p> Graph G = NULL;</p><p> Vertex Bank = 0;</p><p> in = fopen("input.txt", "r");
51、</p><p> if(NULL == in)</p><p><b> {</b></p><p> fprintf(stderr, "Can not open input.txt");</p><p><b> exit(-1);</b></p>&
52、lt;p><b> }</b></p><p> out = fopen("output.txt", "w");</p><p> if(NULL == out)</p><p><b> {</b></p><p> fprintf(stde
53、rr, "Can not open output.txt");</p><p> fclose(in);</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> D= DequeNew();</p>&
54、lt;p> while((EOF != fscanf(in, "%d", &VertexNum)) && (0 <= VertexNum))</p><p><b> {</b></p><p> G = read_case(in, VertexNum, &Bank, D); /* 讀文件直到結(jié)
55、尾 */</p><p> write_result(out, Bank, G, D);</p><p><b> if(G)</b></p><p> GraphDelete(G);</p><p><b> }</b></p><p> fclose(in);
56、</p><p> fclose(out);</p><p> DequeDelete(D);</p><p><b> return 0;</b></p><p><b> }</b></p><p> #define ISLAND_DIAMETER 15
57、 /* 小島的直徑 */</p><p> #define LAKE_BOUNDARY_X50/* 小島到湖邊的距離,在x軸上 */</p><p> #define LAKE_BOUNDARY_Y50/* 小島到湖邊的距離,在y軸上 */</p><p> #define INFINITY10000 /* 可以跳的步數(shù)的最大值 */<
58、;/p><p> typedef unsigned int Vertex;</p><p> typedef double Distance;</p><p> typedef struct GraphNodeRecord{</p><p> int X; /* x軸坐標(biāo) */</p><p>
59、 int Y; /* y軸坐標(biāo) */</p><p> unsigned int Step; /*跳至該點的步數(shù) */</p><p> Vertex Path; /*記錄上一個點 */</p><p> } GraphNode;</p><p> typedef G
60、raphNode *Graph;</p><p> Graph GraphNew(int NodeNum);</p><p> void GraphDelete(Graph G);</p><p> /* 判斷007是否能從起始處跳至該點(x, y) */</p><p> int CheckForStart(int x, int y
61、, Distance d);</p><p> /* 判斷007是否能從該點跳至河岸 */</p><p> int CheckForEnd(int x, int y, Distance d);</p><p> /* 判斷007是否能從點i跳至點j */ </p><p> int CheckForConnect(Graph g,
62、Vertex i, Vertex j, Distance d);</p><p> #include "Graph.h"</p><p> #include "error.h"</p><p> #include <stdlib.h></p><p> /******創(chuàng)建新的Grap
63、h******/</p><p> Graph GraphNew(int NodeNum)</p><p><b> {</b></p><p><b> Graph G;</b></p><p><b> int i;</b></p><p>
64、 if(NodeNum <= 0)return NULL;</p><p> G = malloc(NodeNum * sizeof(GraphNode)); /* 分配空間 */</p><p><b> CHECK(G);</b></p><p> for(i = 0; i < NodeNum; i++)
65、 /* 初始化 */</p><p><b> {</b></p><p> G[i].X = 0;</p><p> G[i].Y = 0;</p><p> G[i].Step = INFINITY; </p><p> G[i].Path = 0;</p&
66、gt;<p><b> }</b></p><p><b> return G;</b></p><p><b> }</b></p><p> /******刪除一個Graph)******/</p><p> void GraphDelete(Gra
67、ph G)</p><p><b> {</b></p><p> if(G)free(G);</p><p><b> }</b></p><p> /*******判斷007是否能從起始處跳至該點(x, y),步長是d******/</p><p> int C
68、heckForStart(int x, int y, Distance d)</p><p><b> {</b></p><p><b> double t;</b></p><p> t = (ISLAND_DIAMETER + (d * 2.0));</p><p> return
69、(x*x + y*y) <= t*t/4.0; </p><p> /* x^2 + y^2 <= (ISLAND_DIAMETER/2.0 + d)^2 */</p><p><b> }</b></p><p> /*******判斷007是否能從該點跳至河岸,步長是d******/</p><p&
70、gt; int CheckForEnd(int x, int y, Distance d)</p><p><b> {</b></p><p> if(x < 0)x = -x; /* 取x的絕對值 */</p><p> if(y < 0)y = -y; /*
71、 取y的絕對值 */</p><p> return (d >= LAKE_BOUNDARY_X - x)/* 由于湖是個正方形,只需檢查這兩個距離*/</p><p> || (d >= LAKE_BOUNDARY_Y - y);</p><p><b> }</b></p><p> /***
72、****判斷007是否能從點i跳至點j,步長是d******/</p><p> int CheckForConnect(Graph g, Vertex i, Vertex j, Distance d)</p><p><b> {</b></p><p><b> int x, y;</b></p>
73、<p> x = g[i].X - g[j].X;</p><p> y = g[i].Y - g[j].Y;</p><p> return x*x + y*y <= d*d;</p><p><b> }</b></p><p> typedef unsigned int ElemType;
74、 /* 在本程序中ElemType指定為int */</p><p> /* 鏈表形式 */</p><p> typedef struct NodeRecord{</p><p> ElemType Element;</p><p> struct NodeRecord *Next; /* 指向下一個nod
75、e */</p><p><b> } *Node; </b></p><p> typedef struct DequeRecord{ </p><p> Node Front, Rear; /* 分別指向Deque的前后兩個點 */</p><p><b> } *Deque;
76、</b></p><p> Deque DequeNew();</p><p> void DequeDelete(Deque D); </p><p> void DequeClear(Deque D); </p><p> #include "Deque.h"</p>&
77、lt;p> #include "error.h"</p><p> #include <stdlib.h></p><p> /******創(chuàng)建新的Deque******/</p><p> Deque DequeNew()</p><p><b> {</b></p
78、><p><b> Deque D;</b></p><p> D = malloc(sizeof(struct DequeRecord));</p><p><b> CHECK(D);</b></p><p> D->Front = D->Rear = malloc(sizeof
79、(struct NodeRecord)); /* 空的頭 */</p><p> CHECK(D->Front);</p><p> D->Front->Element = 0; /* 初始化 */</p><p> D->Rear->Next = NULL;<
80、;/p><p><b> return D;</b></p><p><b> }</b></p><p> /******刪除Deque******/</p><p> void DequeDelete(Deque D)</p><p><b> {<
81、/b></p><p><b> if(D)</b></p><p><b> {</b></p><p> while(D->Front) </p><p><b> {</b></p><p> D->Rear = D-&
82、gt;Front->Next;</p><p> free(D->Front);</p><p> D->Front = D->Rear;</p><p><b> }</b></p><p><b> free(D);</b></p><p>
83、;<b> }</b></p><p><b> }</b></p><p> /******DequeClear刪除所有的節(jié)點除了頭節(jié)點******/</p><p> void DequeClear(Deque D)</p><p><b> {</b></
84、p><p><b> if(D)</b></p><p><b> {</b></p><p> while(D->Front->Next) /* 刪除第一個節(jié)點 */</p><p><b> {</b></p><p>
85、D->Rear = D->Front->Next->Next;</p><p> free(D->Front->Next);</p><p> D->Front->Next = D->Rear;</p><p><b> }</b></p><p> D-&g
86、t;Rear = D->Front;</p><p><b> }</b></p><p><b> }</b></p><p> /******判斷Deque是否為空******/</p><p> int IsEmpty(Deque D)</p><p>&
87、lt;b> {</b></p><p> return D->Front == D->Rear;</p><p><b> }</b></p><p> /******將X元素壓占到D中******/</p><p> void Push(ElemType X, Deque
88、D) </p><p><b> { </b></p><p> Node NewNode; </p><p> NewNode = malloc(sizeof(struct NodeRecord)); /* 建立新的節(jié)點 */ </p><p> CHECK(NewNode);</p><
89、;p> NewNode->Element = X; </p><p> NewNode->Next = D->Front->Next; </p><p> if(D->Front == D->Rear) /* 如果D為空 */</p><p> D->Rear = NewNo
90、de;</p><p> D->Front->Next = NewNode;/* 壓棧 */ </p><p><b> }</b></p><p> /******將第一個元素出棧******/</p><p> ElemType Pop(Deque D) </p><
91、p><b> { </b></p><p> Node Temp; </p><p> ElemType Item; </p><p> if(D->Front == D->Rear)</p><p><b> {</b></p><p> Er
92、ror("Deque is empty");</p><p> return 0; </p><p><b> }</b></p><p><b> else </b></p><p><b> { </b></p><
93、p> Temp = D->Front->Next;/* 得到第一個元素 */ </p><p> D->Front->Next = Temp->Next; /* 重置第一個元素 */</p><p> if(Temp == D->Rear)/* 如果只有一個元素 */</p><p> D->Re
94、ar = D->Front;/* 將D置空 */ </p><p> Item = Temp->Element; </p><p> free(Temp);</p><p> return Item; </p><p><b> } </b></p><p&
95、gt;<b> }</b></p><p> /******插入元素X至D末尾******/ </p><p> void Inject(ElemType X, Deque D) </p><p><b> { </b></p><p> Node NewNode;</p>
96、<p> NewNode = malloc(sizeof(struct NodeRecord)); /* 創(chuàng)建新節(jié)點 */ </p><p> CHECK(NewNode);</p><p> NewNode->Element = X; </p><p> NewNode->Next = NULL;</p><
97、p> D->Rear->Next = NewNode;</p><p> D->Rear = NewNode; </p><p><b> }</b></p><p> int IsEmpty(Deque D); </p><p> void Push(ElemTyp
98、e X, Deque D); </p><p> ElemType Pop(Deque D); </p><p> void Inject(ElemType X, Deque D);</p><p> #define CHECK(X) if(NULL == (X))Error("Out of space!!!")</p>
99、<p> void Error(const char *msg);</p><p> void Warning(const char *msg);</p><p> #include "error.h"</p><p> #include <stdio.h></p><p> #incl
100、ude <stdlib.h></p><p> /******打印錯誤信息,并退出程序******/ </p><p> void Error(const char *msg)</p><p><b> {</b></p><p> if(NULL != msg)</p><p&g
101、t; fprintf(stderr,"%s\n",msg);</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> /******打印警告信息,但并不退出程序******/</p><p> void Warnin
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計--最短路徑拯救007
- 課程設(shè)計-故宮導(dǎo)游咨詢設(shè)計(最短路徑)
- 課程設(shè)計報告---最短路徑求最大利潤
- 單元點最短路徑算法的實現(xiàn)課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu),課程設(shè)計,校園最短路徑問題
- 通信網(wǎng)最短路徑課程設(shè)計--基于c語言對d算法最短路徑的求解
- a算法的改進課程設(shè)計--a最短路徑算法的改進
- 最短路徑問題―――螞蟻爬行的最短路徑
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---圖頂點間最短路徑算法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--dijkstra算法求最短路徑
- 最短路徑問題--教學(xué)設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---交通旅游圖的最短路徑問題
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--弗洛伊德算法與最短路徑
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--可視化弗洛伊德最短路徑
- 最短路徑學(xué)年論文
- 最短路徑問題(經(jīng)典)
- 最短路徑規(guī)劃研究
- 最短路徑問題(經(jīng)典)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--用c#語言解決最短路徑的問題
- 134課題學(xué)習(xí)最短路徑問題2
評論
0/150
提交評論