圖遍歷的演示課程設(shè)計(jì)報(bào)告_第1頁(yè)
已閱讀1頁(yè),還剩12頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p><b>  計(jì)算機(jī)科學(xué)與技術(shù)系</b></p><p><b>  課程設(shè)計(jì)報(bào)告</b></p><p>  20 11~20 12 學(xué)年第 二 學(xué)期</p><p>  2011 年 6 月</p><p><b>  圖遍歷的演示</b><

2、/p><p>  一、問(wèn)題分析和任務(wù)定義</p><p>  很多涉及圖上操作的算法都是以圖的遍歷操作為基礎(chǔ)的。試寫一個(gè)程序,演示在連通的無(wú)向圖上訪問(wèn)全部結(jié)點(diǎn)的操作。將每個(gè)結(jié)點(diǎn)看做一個(gè)地名,如合肥。然后任選國(guó)內(nèi)的城市,起點(diǎn)未合肥,忽略城市間的里程。</p><p>  設(shè)圖的結(jié)點(diǎn)20-30個(gè),每個(gè)結(jié)點(diǎn)用一個(gè)編號(hào)表示(如果一個(gè)圖有n個(gè)結(jié)點(diǎn),則它們的編號(hào)分別為1,2,…,n

3、)。通過(guò)輸入圖的全部邊(存于數(shù)據(jù)文件中,從文件讀寫)輸入一個(gè)圖,每個(gè)邊為一個(gè)數(shù)對(duì),可以對(duì)邊的輸入順序作出某種限制。注意,生成樹(shù)的邊是有向邊,端點(diǎn)順序不能顛倒。</p><p>  二、數(shù)據(jù)結(jié)構(gòu)的選擇和概要設(shè)計(jì)</p><p>  城市與城市之間的關(guān)系使沒(méi)有方向的,無(wú)向圖采用鄰近多重表來(lái)實(shí)現(xiàn),主要要表示無(wú)向圖中的各個(gè)結(jié)點(diǎn)和邊,在多重表中邊是采用兩個(gè)結(jié)點(diǎn)來(lái)表示的。</p><

4、;p>  在鄰接表中Edgenode表示鄰接表中的結(jié)點(diǎn)類型,其中含有訪問(wèn)標(biāo)記mark,一條邊所依附的兩個(gè)結(jié)點(diǎn)的序號(hào)ivex和jvex,以及分別指向依附于ivex和jvex的頂點(diǎn)邊的鏈域ilink和jlink。</p><p>  其中,鄰接表中的表頭結(jié)點(diǎn)用Vexnode表示,包含了頂點(diǎn)信息data和指向第一個(gè)邊結(jié)點(diǎn)的firstedge。</p><p>  用AMLGraph表示整個(gè)

5、無(wú)向圖,包含了圖的頂點(diǎn)vexnum和邊數(shù)edgenum。</p><p><b>  結(jié)點(diǎn)坐標(biāo)信息:</b></p><p>  struct loc //結(jié)點(diǎn)坐標(biāo)信息</p><p><b>  {</b></p><p>  int v; //結(jié)點(diǎn)序號(hào)</p><p>

6、  int x; //x坐標(biāo)</p><p>  int y; //y坐標(biāo)</p><p><b>  };</b></p><p><b>  邊結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu):</b></p><p>  struct Edgenode//邊結(jié)點(diǎn) </p><p><b> 

7、 { </b></p><p>  int mark;//標(biāo)志域,指示該邊是否被訪問(wèn)過(guò)(0:沒(méi)有1:有) </p><p>  int ivex,jvex;//該邊關(guān)聯(lián)的兩個(gè)頂點(diǎn)的位置 </p><p>  Edgenode *ilink,*jlink;//分別指向關(guān)聯(lián)這兩個(gè)頂點(diǎn)的下一條邊 </p><p><b>  

8、}; </b></p><p><b>  頂點(diǎn)結(jié)點(diǎn):</b></p><p>  struct Vexnode//頂點(diǎn)結(jié)點(diǎn) </p><p><b>  { </b></p><p>  int data; //頂點(diǎn)名稱,用數(shù)字表示城市</p><p> 

9、 Edgenode *firstedge;//指向第一條關(guān)聯(lián)該結(jié)點(diǎn)的邊 </p><p><b>  }; </b></p><p>  AMLGraph類:</p><p>  圖-1 AMLGraph類UML圖</p><p><b>  三、詳細(xì)設(shè)計(jì)和編碼</b></p><

10、;p>  程序主體部分主要包括兩大部分,一是遍歷算法部分;另一部分是對(duì)演示圖的處理。遍歷算法部分主要包括了,鄰接多重表構(gòu)造的無(wú)向圖的初始化、深度遍歷和廣度遍歷;對(duì)演示圖的處理包括了,結(jié)點(diǎn)坐標(biāo)信息的初始化和繪圖,運(yùn)用了graphics.h庫(kù)中的繪圖函數(shù)。</p><p><b>  1、深度遍歷</b></p><p>  函數(shù)名稱: void DFS(int v

11、) </p><p>  函數(shù)功能:實(shí)現(xiàn)一張無(wú)向圖從一個(gè)指定結(jié)點(diǎn)的深度搜索遍歷,并輸出結(jié)點(diǎn)序號(hào)函數(shù)參數(shù): int v 開(kāi)始的結(jié)點(diǎn)</p><p><b>  具體代碼:</b></p><p>  void DFS(int v)//深度優(yōu)先搜索遍歷(遞歸)</p><p><b>  {</b>

12、</p><p>  Edgenode *p;</p><p>  visited[v]=1;//標(biāo)志v已被訪問(wèn)</p><p>  cout<<v<<" ";</p><p><b>  int i=v;</b></p><p>  p=adjmul

13、ist[v].firstedge;//取v邊表的頭指針,使P指向firstedge</p><p>  while(p!=NULL) //依次搜索v的鄰接點(diǎn)</p><p><b>  {</b></p><p>  if(p->ivex==i)</p><p><b>  {</b><

14、;/p><p>  if(visited[p->jvex]==0) //鄰近點(diǎn)未被訪問(wèn)過(guò)</p><p><b>  { </b></p><p>  dline(l[v].x,l[v].y,l[p->jvex].x,l[p->jvex].y);</p><p>  DFS(p->jvex)

15、; //遞歸調(diào)用</p><p><b>  }</b></p><p>  p=p->ilink;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b&g

16、t;</p><p>  if(visited[p->ivex]==0)</p><p><b>  {</b></p><p>  dline(l[v].x,l[v].y,l[p->ivex].x,l[p->ivex].y);</p><p>  DFS(p->ivex);//遞歸調(diào)用<

17、/p><p><b>  }</b></p><p>  p=p->jlink;</p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b></p>&

18、lt;p><b>  2、廣度遍歷</b></p><p>  函數(shù)名稱:void BFS(int v) </p><p>  函數(shù)功能:實(shí)現(xiàn)一張無(wú)向圖從一個(gè)指定結(jié)點(diǎn)的廣度度搜索遍歷,并輸出結(jié)點(diǎn)序號(hào);</p><p>  函數(shù)參數(shù): int v開(kāi)始的結(jié)點(diǎn),返回參數(shù)為void</p><p><b>  

19、具體代碼:</b></p><p>  void BFS(int v)//廣度優(yōu)先搜索遍歷</p><p><b>  {</b></p><p><b>  int i,vi;</b></p><p>  int Queue[MAX_VERTEX_NUM],front=0,rear=0

20、; //建立隊(duì)列數(shù)組</p><p>  Edgenode *p;</p><p>  for(i=0;i<vexnum;i++)//全部節(jié)點(diǎn)標(biāo)記為未訪問(wèn)</p><p>  visited[i]=0;</p><p>  visited[v]=1; //開(kāi)始結(jié)點(diǎn)標(biāo)記為已訪問(wèn)</p><p>  cout&l

21、t;<v; //輸出當(dāng)前訪問(wèn)結(jié)點(diǎn)位置</p><p>  cout<<"\n";</p><p>  rear=(rear+1)%MAX_VERTEX_NUM; //取模初始化隊(duì)列</p><p>  Queue[rear]=v;//入隊(duì)</p><p>  while(front!=rear)/

22、/隊(duì)頭和隊(duì)尾計(jì)數(shù)器不相等,即當(dāng)隊(duì)列非空</p><p><b>  {</b></p><p>  front=(front+1)%MAX_VERTEX_NUM;//出隊(duì)</p><p>  vi=Queue[front];//vi即表頭數(shù)據(jù)元素值</p><p>  p=adjmulist[vi].firstedge

23、;//p指向表頭節(jié)點(diǎn)所指的鄰接點(diǎn)</p><p>  while(p!=NULL)//當(dāng)表頭指針?biāo)傅泥徑狱c(diǎn)不為空</p><p><b>  {</b></p><p>  if(p->ivex==vi)</p><p><b>  {</b></p><p>  i

24、f(visited[p->jvex]==0)//邊節(jié)點(diǎn)內(nèi)元素未被訪問(wèn)則訪問(wèn)節(jié)點(diǎn)內(nèi)元素,并對(duì)其標(biāo)記已訪問(wèn)</p><p><b>  {</b></p><p>  visited[p->jvex]=1;</p><p>  cout<<p->jvex<<" ";</

25、p><p>  dline(l[vi].x,l[vi].y,l[p->jvex].x,l[p->jvex].y); //繪制路徑</p><p>  rear=(rear+1)%MAX_VERTEX_NUM;//隊(duì)列的尾指針計(jì)數(shù)器加一,即后移一位</p><p>  Queue[rear]=p->jvex;</p&

26、gt;<p><b>  }</b></p><p>  p=p->ilink;//邊節(jié)點(diǎn)內(nèi)元素已被訪問(wèn),指向下一鄰接點(diǎn)</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</

27、b></p><p>  if(visited[p->ivex]==0)</p><p><b>  {</b></p><p>  visited[p->ivex]=1;</p><p>  cout<<p->ivex<<" ";</p>

28、<p>  dline(l[vi].x,l[vi].y,l[p->ivex].x,l[p->ivex].y); //繪制路徑</p><p>  rear=(rear+1)%MAX_VERTEX_NUM;</p><p>  Queue[rear]=p->ivex;</p><p><b>  }</b

29、></p><p>  p=p->jlink;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p&

30、gt;<p>  3、圖的創(chuàng)建和初始化</p><p>  函數(shù)名稱:void AML_Init()</p><p>  函數(shù)功能:創(chuàng)建一張固定結(jié)點(diǎn)和邊數(shù)的無(wú)向圖,邊與結(jié)點(diǎn)的關(guān)系是從文件中讀取</p><p>  函數(shù)參數(shù):形參為空,返回也為void</p><p><b>  具體代碼:</b></

31、p><p>  void AML_Init() </p><p><b>  { </b></p><p>  ifstream icin;</p><p>  icin.open("d:\wenjian2.txt"); </p><p>  int i,j,k;</p>

32、;<p>  int edge[30][2];//二維數(shù)組來(lái)存儲(chǔ)邊的關(guān)系,30條邊和ivex,jvex邊集的兩結(jié)點(diǎn)</p><p>  for(i=0;i<edgenum;i++)</p><p>  for(j=0;j<2;j++)</p><p>  icin>>edge[i][j];</p><

33、p>  for(i=0;i<vexnum;i++) //初始化頂點(diǎn)</p><p><b>  { </b></p><p>  adjmulist[i].data=i+1; </p><p>  adjmulist[i].firstedge=NULL; </p><p><b>  } <

34、/b></p><p>  for(k=0;k<edgenum;k++)//初始化邊信息</p><p><b>  { </b></p><p>  Edgenode *e=new Edgenode; //申請(qǐng)邊結(jié)點(diǎn)空間</p><p>  e->ivex=edge[k][0];</p>

35、;<p>  e->jvex=edge[k][1];//讀入2個(gè)頂點(diǎn)的值</p><p>  e->ilink=adjmulist[e->ivex].firstedge;//將頭結(jié)點(diǎn)的firstedge指針賦給新結(jié)點(diǎn)的ilink</p><p>  adjmulist[e->ivex].firstedge=e;//將頭結(jié)點(diǎn)的指針指向新結(jié)點(diǎn)<

36、;/p><p>  e->jlink=adjmulist[e->jvex].firstedge;//將新結(jié)點(diǎn)的jlink指針指向其jvex結(jié)點(diǎn)所依附的結(jié)點(diǎn)</p><p>  adjmulist[e->jvex].firstedge=e;</p><p><b>  } </b></p><p> 

37、 init_location(); //初始化所有結(jié)點(diǎn)的坐標(biāo)信息</p><p><b>  } </b></p><p><b>  4、初始化頂點(diǎn)坐標(biāo)</b></p><p>  函數(shù)名稱:void init_location()</p><p>  函數(shù)功能:此函數(shù)為初始化頂點(diǎn)坐標(biāo),主要用來(lái)

38、讀取存儲(chǔ)在文件中的各個(gè)頂點(diǎn)坐標(biāo)信息</p><p>  函數(shù)參數(shù):形參為空,返回值為空</p><p><b>  具體代碼:</b></p><p>  void init_location() //初始化結(jié)點(diǎn)的坐標(biāo)信息</p><p><b>  {</b></p><p&

39、gt;  ifstream icin;</p><p>  l=new loc[20];</p><p>  icin.open("d:\wenjian1.txt");</p><p>  for(int i=1;i<=26;i++)</p><p>  icin>>l[i].v>>l[i]

40、.x>>l[i].y;</p><p><b>  }</b></p><p><b>  上機(jī)調(diào)試過(guò)程</b></p><p>  圖-2 具體的圖關(guān)系圖 圖-3 存儲(chǔ)頂點(diǎn)坐標(biāo)信息文件</p><p><b>  測(cè)試結(jié)果及其分析</b&g

41、t;</p><p>  圖-4 深度搜索遍歷結(jié)果</p><p>  圖-5深度搜索遍歷演示</p><p>  圖-6 廣度搜索遍歷演示</p><p>  圖-7 廣度度搜索遍歷演示</p><p><b>  六、用戶使用說(shuō)明</b></p><p>  本程序采用

42、C++語(yǔ)言在Windows 7+VC6.0環(huán)境下編寫,主要功能是演示圖的兩種遍歷過(guò)程;</p><p>  程序所默認(rèn)演示無(wú)向圖包括26個(gè)結(jié)點(diǎn)和30條邊,其中26個(gè)結(jié)點(diǎn)數(shù)字分別代表26個(gè)省會(huì)城市,30條邊表示他們之間的關(guān)系,具體關(guān)系如演示圖所示;</p><p>  進(jìn)入軟件界面后,首先需要輸入開(kāi)始進(jìn)行遍歷的城市位置(即對(duì)應(yīng)的結(jié)點(diǎn)數(shù)字),然后再進(jìn)行選擇進(jìn)行圖遍歷的方式,本程序提供2種圖遍歷

43、方式,深度優(yōu)先遍歷和廣度優(yōu)先遍歷,選擇遍歷方式后,遍歷結(jié)果將之間顯示在屏幕上,左邊數(shù)字為訪問(wèn)的結(jié)點(diǎn),右邊邊集是訪問(wèn)時(shí)所經(jīng)過(guò)的邊。</p><p>  在運(yùn)行程序之前,請(qǐng)確保系統(tǒng)裝有Easyx的graphicsk庫(kù)。</p><p><b>  七、參考文獻(xiàn)</b></p><p>  [1] 王昆侖,李紅. 數(shù)據(jù)結(jié)構(gòu)與算法. 北京:中國(guó)鐵道出版

44、社,2006年5月。</p><p>  [2] 編程中國(guó):http://bbs.bccn.net/thread-329777-1-1.html</p><p>  [3] Easyx:http://www.easyx.cn</p><p><b>  附錄</b></p><p><b>  詳細(xì)代碼:&

45、lt;/b></p><p><b>  graph.h</b></p><p>  #include <graphics.h> </p><p>  #include <conio.h></p><p>  #include <iostream> </p>

46、<p>  #include <fstream> </p><p>  //#include "image.h"</p><p>  using namespace std; </p><p>  #define MAX_VERTEX_NUM 30//頂點(diǎn)最大個(gè)數(shù)</p><p>  bool v

47、isited[100]; //頂點(diǎn)是否被訪問(wèn)標(biāo)志 </p><p>  struct loc //結(jié)點(diǎn)坐標(biāo)信息</p><p><b>  {</b></p><p>  int v; //結(jié)點(diǎn)序號(hào)</p><p>  int x; //x坐標(biāo)</p><p>  int y; //y坐標(biāo)<

48、;/p><p><b>  };</b></p><p>  //鄰接多重表的存儲(chǔ) </p><p>  struct Edgenode//邊結(jié)點(diǎn) </p><p><b>  { </b></p><p>  int mark;//標(biāo)志域,指示該邊是否被訪問(wèn)過(guò)(0:沒(méi)有1:

49、有) </p><p>  int ivex,jvex;//該邊關(guān)聯(lián)的兩個(gè)頂點(diǎn)的位置 </p><p>  Edgenode *ilink,*jlink;//分別指向關(guān)聯(lián)這兩個(gè)頂點(diǎn)的下一條邊 </p><p><b>  }; </b></p><p>  struct Vexnode//頂點(diǎn)結(jié)點(diǎn) </p>

50、;<p><b>  { </b></p><p>  int data; //頂點(diǎn)名稱,用數(shù)字表示城市</p><p>  Edgenode *firstedge;//指向第一條關(guān)聯(lián)該結(jié)點(diǎn)的邊 </p><p><b>  }; </b></p><p>  class AMLGr

51、aph </p><p><b>  { </b></p><p><b>  private: </b></p><p>  loc *l; //坐標(biāo)信息指針</p><p>  Vexnode *adjmulist; //頂點(diǎn)數(shù)組指針 </p><p>  int vex

52、num; //定點(diǎn)數(shù)目 </p><p>  int edgenum; //邊數(shù)目 </p><p>  int maxnum; //頂點(diǎn)數(shù)最大值 </p><p><b>  public: </b></p><p><b>  //構(gòu)造函數(shù)</b></p><p>  A

53、MLGraph(int num1=26,int num2=30)</p><p><b>  { </b></p><p>  adjmulist=new Vexnode[num1]; </p><p>  vexnum=num1;edgenum=num2;</p><p>  maxnum=MAX_VERTEX_NUM

54、;</p><p><b>  } </b></p><p><b>  //析構(gòu)函數(shù)</b></p><p>  ~AMLGraph()</p><p><b>  { </b></p><p>  delete[]adjmulist; </

55、p><p><b>  } </b></p><p>  //定位頂點(diǎn)在頂點(diǎn)數(shù)組中的位置 </p><p>  int Locate_Vex(int v) </p><p><b>  { </b></p><p>  for(int i=0;i<vexnum;i++)&l

56、t;/p><p>  if((adjmulist[i].data)==v) </p><p>  return i; </p><p>  return -1; </p><p><b>  } </b></p><p><b>  //構(gòu)造無(wú)向圖</b></p>

57、<p>  void AML_Init() </p><p><b>  { </b></p><p>  ifstream icin;</p><p>  icin.open("d:\wenjian2.txt"); </p><p>  int i,j,k;</p><

58、p>  int edge[30][2];//二維數(shù)組來(lái)存儲(chǔ)邊的關(guān)系,30條邊和ivex,jvex邊集的兩結(jié)點(diǎn)</p><p>  for(i=0;i<edgenum;i++)</p><p>  for(j=0;j<2;j++)</p><p>  icin>>edge[i][j];</p><p>  for

59、(i=0;i<vexnum;i++) //初始化頂點(diǎn)</p><p><b>  { </b></p><p>  adjmulist[i].data=i+1; </p><p>  adjmulist[i].firstedge=NULL; </p><p><b>  } </b><

60、/p><p>  for(k=0;k<edgenum;k++)//初始化邊信息</p><p><b>  { </b></p><p>  Edgenode *e=new Edgenode; //申請(qǐng)邊結(jié)點(diǎn)空間</p><p>  e->ivex=edge[k][0];</p><p&g

61、t;  e->jvex=edge[k][1];//讀入2個(gè)頂點(diǎn)的值</p><p>  e->ilink=adjmulist[e->ivex].firstedge;//將頭結(jié)點(diǎn)的firstedge指針賦給新結(jié)點(diǎn)的ilink</p><p>  adjmulist[e->ivex].firstedge=e;//將頭結(jié)點(diǎn)的指針指向新結(jié)點(diǎn)</p><p

62、>  e->jlink=adjmulist[e->jvex].firstedge;//將新結(jié)點(diǎn)的jlink指針指向其jvex結(jié)點(diǎn)所依附的結(jié)點(diǎn)</p><p>  adjmulist[e->jvex].firstedge=e;</p><p><b>  } </b></p><p>  init_location();

63、 //初始化所有結(jié)點(diǎn)的坐標(biāo)信息</p><p><b>  } </b></p><p><b>  //深度優(yōu)先遍歷 </b></p><p>  void DFS_Traverse() </p><p><b>  { </b></p><p>  

64、for(int i=0;i<vexnum;i++) </p><p>  visited[i]=false;//初始化所有頂點(diǎn)未被訪問(wèn)過(guò)</p><p>  for(i=0;i<vexnum;i++) </p><p>  if(!visited[i])//如果未被訪問(wèn)過(guò),進(jìn)行訪問(wèn)DFS遍歷</p><p><b&g

65、t;  DFS(i); </b></p><p>  cout<<endl; </p><p><b>  } </b></p><p>  void DFS(int v)//深度優(yōu)先搜索遍歷(遞歸)</p><p><b>  {</b></p><

66、p>  Edgenode *p;</p><p>  visited[v]=1;//標(biāo)志v已被訪問(wèn)</p><p>  cout<<v<<" ";</p><p><b>  int i=v;</b></p><p>  p=adjmulist[v].firstedge

67、;//取v邊表的頭指針,使P指向firstedge</p><p>  while(p!=NULL) //依次搜索v的鄰接點(diǎn)</p><p><b>  {</b></p><p>  if(p->ivex==i)</p><p><b>  {</b></p><p&g

68、t;  if(visited[p->jvex]==0) //鄰近點(diǎn)未被訪問(wèn)過(guò)</p><p><b>  { </b></p><p>  dline(l[v].x,l[v].y,l[p->jvex].x,l[p->jvex].y);</p><p>  DFS(p->jvex); //遞歸調(diào)用</p

69、><p><b>  }</b></p><p>  p=p->ilink;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p>&l

70、t;p>  if(visited[p->ivex]==0)</p><p><b>  {</b></p><p>  dline(l[v].x,l[v].y,l[p->ivex].x,l[p->ivex].y);</p><p>  DFS(p->ivex);//遞歸調(diào)用</p><p>

71、;<b>  }</b></p><p>  p=p->jlink;</p><p><b>  }</b></p><p><b>  } </b></p><p><b>  }</b></p><p><b>

72、;  //廣度優(yōu)先遍歷 </b></p><p>  void BFS_Traverse() </p><p><b>  { </b></p><p>  for(int i=0;i<vexnum;i++) </p><p>  visited[i]=false; </p><p&

73、gt;  for(i=0;i<vexnum;i++) </p><p>  if(!visited[i]) </p><p><b>  BFS(i); </b></p><p>  cout<<endl; </p><p><b>  } </b></p><

74、p>  void BFS(int v)//廣度優(yōu)先搜索遍歷</p><p><b>  {</b></p><p><b>  int i,vi;</b></p><p>  int Queue[MAX_VERTEX_NUM],front=0,rear=0; //建立隊(duì)列數(shù)組</p><p>

75、  Edgenode *p;</p><p>  for(i=0;i<vexnum;i++)//全部節(jié)點(diǎn)標(biāo)記為未訪問(wèn)</p><p>  visited[i]=0;</p><p>  visited[v]=1; //開(kāi)始結(jié)點(diǎn)標(biāo)記為已訪問(wèn)</p><p>  cout<<v; //輸出當(dāng)前訪問(wèn)結(jié)點(diǎn)位置</p&g

76、t;<p>  cout<<"\n";</p><p>  rear=(rear+1)%MAX_VERTEX_NUM; //取模初始化隊(duì)列</p><p>  Queue[rear]=v;//入隊(duì)</p><p>  while(front!=rear)//隊(duì)頭和隊(duì)尾計(jì)數(shù)器不相等,即當(dāng)隊(duì)列非空</p>

77、<p><b>  {</b></p><p>  front=(front+1)%MAX_VERTEX_NUM;//出隊(duì)</p><p>  vi=Queue[front];//vi即表頭數(shù)據(jù)元素值</p><p>  p=adjmulist[vi].firstedge;//p指向表頭節(jié)點(diǎn)所指的鄰接點(diǎn)</p><

78、;p>  while(p!=NULL)//當(dāng)表頭指針?biāo)傅泥徑狱c(diǎn)不為空</p><p><b>  {</b></p><p>  if(p->ivex==vi)</p><p><b>  {</b></p><p>  if(visited[p->jvex]==0){

79、</p><p>  visited[p->jvex]=1;</p><p>  cout<<p->jvex<<" ";</p><p>  dline(l[vi].x,l[vi].y,l[p->jvex].x,l[p->jvex].y); rear=(rear+1)%MAX_VER

80、TEX_NUM; Queue[rear]=p->jvex;</p><p><b>  }</b></p><p>  p=p->ilink;//邊節(jié)點(diǎn)內(nèi)元素已被訪問(wèn),指向下一鄰接點(diǎn)</p><p><b>  }</b></p><p><b>  e

81、lse</b></p><p><b>  {</b></p><p>  if(visited[p->ivex]==0)</p><p><b>  {</b></p><p>  visited[p->ivex]=1;</p><p>  cout

82、<<p->ivex<<" ";</p><p>  dline(l[vi].x,l[vi].y,l[p->ivex].x,l[p->ivex].y); rear=(rear+1)%MAX_VERTEX_NUM;</p><p>  Queue[rear]=p->ivex;</p><

83、;p><b>  }</b></p><p>  p=p->jlink;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b

84、>  }</b></p><p>  void dline(int x1,int y1,int x2,int y2) //畫(huà)線</p><p><b>  {</b></p><p>  setlinestyle(PS_DASH, NULL, 3); //設(shè)置線形為寬度 3 像素的虛線</p><p&g

85、t;  line(x1,y1,x2,y2);</p><p><b>  }</b></p><p>  void init_location() //初始化結(jié)點(diǎn)的坐標(biāo)信息</p><p><b>  {</b></p><p>  ifstream icin;</p><p&

86、gt;  l=new loc[20];</p><p>  icin.open("d:\wenjian1.txt");</p><p>  for(int i=1;i<=26;i++)</p><p>  icin>>l[i].v>>l[i].x>>l[i].y;</p><p>

87、;<b>  }</b></p><p>  void image()//繪制矢量無(wú)向圖</p><p><b>  {</b></p><p>  HWND hWnd = GetHWnd();</p><p>  // 使用 API 函數(shù)修改窗口名稱</p><p>  

88、SetWindowText(hWnd, "圖的遍歷演示");</p><p>  HWND initgraph(</p><p>  int Width,</p><p>  int Height,</p><p>  int Flag =SHOWCONSOLE </p><p><b>

89、;  );</b></p><p>  initgraph(800, 600); </p><p>  loadimage(NULL, "D:\\map1.bmp");</p><p><b>  }</b></p><p><b>  }; </b></p

90、><p><b>  Main.h</b></p><p>  #include "graph.h" </p><p>  #include <iostream> </p><p>  #include <cstdlib></p><p>  using n

91、amespace std; </p><p>  void main() </p><p><b>  { </b></p><p>  system("color f0");</p><p>  AMLGraph G; </p><p>  G.AML_Init(); <

92、;/p><p><b>  int v,op;</b></p><p>  char op1;</p><p>  cout<<"\t\t\t圖的DFS和BFS的演示V1.0\n";</p><p>  cout<<"\t\t\t正在從文件中讀取。。。\n";

93、</p><p>  cout<<"\t\t\t從文件中讀取信息完畢\n";</p><p>  //cout<<"鄰接多重表結(jié)構(gòu):"<<endl; </p><p>  cout<<"\n1:長(zhǎng)春2:哈爾濱3:呼和浩特4:北京5:沈陽(yáng)6:寧夏7:太原8:石家莊9:天津

94、10:濟(jì)南\n11:西安12:鄭州13:南京14:上海15:合肥16:成都17:重慶18:武漢19:杭州20:貴州\n21:長(zhǎng)沙22:南昌23:福州24:昆明25:南寧26:廣州";</p><p>  while(1){ </p><p>  cout<<"\n\t\t\t請(qǐng)輸入起始位置(用地名前的數(shù)字表示):\n";</p>&

95、lt;p><b>  cin>>v;</b></p><p>  cout<<"\t\t1.DFS"<<endl;</p><p>  cout<<"\t\t2.BFS"<<endl;</p><p>  cout<<"

96、;\t\t請(qǐng)選擇遍歷方式:";</p><p><b>  cin>>op;</b></p><p>  switch(op)</p><p><b>  {</b></p><p>  case 1:cout<<"DFS如下:\n";G.ima

97、ge();G.DFS(v);break;</p><p>  case 2:cout<<"BFS如下:\n";G.image();G.BFS(v);;break;</p><p><b>  }</b></p><p>  cout<<"\n\t\t\t是否繼續(xù)?(Y/N)";&l

98、t;/p><p><b>  cin>>op1;</b></p><p>  if(op1=='N'||op1=='n')</p><p><b>  {</b></p><p>  cout<<"\t\t\t感謝使用!";b

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論