2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論