2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩25頁(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>  《軟件認(rèn)知實(shí)踐》報(bào)告</p><p>  姓 名: 學(xué) 號(hào): </p><p>  專(zhuān) 業(yè): </p><p>  設(shè)計(jì)題目: </p><p>  指導(dǎo)教師: </p><p&g

2、t;  2013年12月30日</p><p><b>  目 錄</b></p><p>  第1章 題目概述2</p><p>  第1.1節(jié) 題目要求2</p><p>  第1.2節(jié) 主要難點(diǎn)3</p><p>  第2章 系統(tǒng)流程圖4</p><p&g

3、t;  第3章 數(shù)據(jù)結(jié)構(gòu)和算法5</p><p>  第4章 核心代碼分析6</p><p>  第5章 復(fù)雜度分析25</p><p><b>  參考文獻(xiàn)25</b></p><p><b>  題目概述</b></p><p>  第1.1節(jié) 題目要求</

4、p><p>  (1)自選存儲(chǔ)結(jié)構(gòu),輸入含n個(gè)頂點(diǎn)(用字符表示頂點(diǎn))和e條邊的圖G;</p><p>  (2)求每個(gè)頂點(diǎn)的度,輸出結(jié)果;</p><p>  (3)指定任意頂點(diǎn)x為初始頂點(diǎn),對(duì)圖G作DFS遍歷,輸出DFS頂點(diǎn)序列(提示:使用一個(gè)棧實(shí)現(xiàn)DFS);</p><p>  (4)指定任意頂點(diǎn)x為初始頂點(diǎn),對(duì)圖G作BFS遍歷,輸出BFS頂

5、點(diǎn)序列(提示:使用一個(gè)隊(duì)列實(shí)現(xiàn)BFS);</p><p>  (5)輸入頂點(diǎn)x,查找圖G:若存在含x的頂點(diǎn),則刪除該結(jié)點(diǎn)及與之相關(guān)連的邊,并作DFS遍歷(執(zhí)行操作3);否則輸出信 息“無(wú)x”;</p><p>  (6)判斷圖G是否是連通圖,輸出信息“YES”/“NO”;</p><p>  (7)如果選用的存儲(chǔ)結(jié)構(gòu)是鄰接矩陣,則用鄰接矩陣的信息生成圖G的鄰接表,即

6、復(fù)制圖G,然再執(zhí)行操作(2);反之亦然。</p><p>  第1.2節(jié) 主要難點(diǎn)</p><p>  (1)自選存儲(chǔ)結(jié)構(gòu)創(chuàng)建一個(gè)圖:通過(guò)用戶從鍵盤(pán)敲入的兩個(gè)數(shù)值分別確定圖的頂點(diǎn)數(shù)和邊數(shù),選擇鄰接矩陣存儲(chǔ)結(jié)構(gòu)將圖的結(jié)點(diǎn)信息存儲(chǔ)在一個(gè)順序表中,圖的邊信息存儲(chǔ)在一個(gè)二維數(shù)組中。</p><p>  (2)求每個(gè)頂點(diǎn)的度:</p><p>  1.

7、鄰接矩陣存儲(chǔ)結(jié)構(gòu)下求每個(gè)頂點(diǎn)的度:利用圖的鄰接矩陣,每個(gè)頂點(diǎn)所在行和所在列的邊的權(quán)值如果存在則該頂點(diǎn)的度+1,依次算出每個(gè)頂點(diǎn)的度,并且記錄在一個(gè)數(shù)組中輸出。</p><p>  2.鄰接表存儲(chǔ)結(jié)構(gòu)下求每個(gè)頂點(diǎn)的度:定義一個(gè)鄰接邊指針循環(huán)指向頂點(diǎn)的鄰接邊單鏈表頭結(jié)點(diǎn),當(dāng)結(jié)點(diǎn)不空時(shí),該頂點(diǎn)的出度+1,鄰接邊弧頭結(jié)點(diǎn)的入度+1,依次求出每個(gè)頂點(diǎn)的出度和入度之和就為該頂點(diǎn)的度。</p><p>

8、  (3)圖的深度優(yōu)先遍歷:采取鄰接矩陣結(jié)構(gòu),指定任意頂點(diǎn)x為初始頂點(diǎn)</p><p>  1.訪問(wèn)結(jié)點(diǎn)v并標(biāo)記結(jié)點(diǎn)v已訪問(wèn);</p><p>  2.查找結(jié)點(diǎn)v的第一個(gè)鄰接結(jié)點(diǎn)w;</p><p>  3.若結(jié)點(diǎn)v的鄰接結(jié)點(diǎn)w存在,則繼續(xù)執(zhí)行,否則算法結(jié)束;</p><p>  4.若結(jié)點(diǎn)w尚未被訪問(wèn),則遞歸訪問(wèn)結(jié)點(diǎn)w;</p>

9、<p>  5.查找結(jié)點(diǎn)v的w鄰接結(jié)點(diǎn)的下一個(gè)鄰接結(jié)點(diǎn)w,轉(zhuǎn)到步驟3。</p><p>  (4)圖的廣度優(yōu)先遍歷:采取鄰接矩陣結(jié)構(gòu),指定任意頂點(diǎn)x為初始頂點(diǎn),利用順序循環(huán)隊(duì)列以保持訪問(wèn)過(guò)的結(jié)點(diǎn)的順序</p><p>  1.首先訪問(wèn)初始結(jié)點(diǎn)v并標(biāo)記結(jié)點(diǎn)v為已訪問(wèn);</p><p><b>  2.結(jié)點(diǎn)v入隊(duì)列;</b></

10、p><p>  3.當(dāng)隊(duì)列非空時(shí)則繼續(xù)執(zhí)行,否則算法結(jié)束;</p><p>  4.出隊(duì)列取得隊(duì)頭結(jié)點(diǎn)u;</p><p>  5.查找u的第一個(gè)鄰接結(jié)點(diǎn)w;</p><p>  6.若u的鄰接結(jié)點(diǎn)w不存在則轉(zhuǎn)到步驟3,否則循環(huán)執(zhí)行下列步驟:</p><p>  6.1若結(jié)點(diǎn)w尚未被訪問(wèn),則訪問(wèn)結(jié)點(diǎn)w并標(biāo)記結(jié)點(diǎn)w為已訪問(wèn);

11、</p><p>  6.2結(jié)點(diǎn)w入隊(duì)列;</p><p>  6.3查找結(jié)點(diǎn)u的w鄰接結(jié)點(diǎn)的下一個(gè)鄰接結(jié)點(diǎn)w,轉(zhuǎn)到步驟6 。</p><p>  (5)判斷有向圖的強(qiáng)連通性:采取鄰接表結(jié)構(gòu),在圖中尋找一個(gè)包含所有頂點(diǎn)且首尾相連的環(huán),若這樣的環(huán)存在,則該圖為強(qiáng)連通圖,否則不為強(qiáng)連通圖。</p><p>  (6)用鄰接矩陣的信息生成鄰接表:定

12、義一個(gè)鄰接表的邊信息結(jié)構(gòu)體,將鄰接矩陣的邊信息轉(zhuǎn)換成鄰接表的邊信息存儲(chǔ)到鄰接邊的單鏈表中。</p><p><b>  第二章 系統(tǒng)流程圖</b></p><p><b>  數(shù)據(jù)結(jié)構(gòu)和算法</b></p><p>  (1)有向圖頂點(diǎn)的數(shù)據(jù)類(lèi)型DataType 定義如下:</p><p>  ty

13、pedef int DataType ;</p><p>  (2)鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的結(jié)構(gòu)體定義如下:</p><p>  typedef struct</p><p><b>  {</b></p><p>  SeqList Vertices; </p><p>  int edge[Ma

14、xVertices][MaxVertices];</p><p>  int numOfEdges; </p><p>  }AdjMGraph; </p><p>  (3)鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的邊信息結(jié)構(gòu)體定義如下:</p><p>  typedef struct</p><p><b>  {<

15、;/b></p><p><b>  int row; </b></p><p><b>  int col; </b></p><p>  int weight; </p><p>  }RowColWeight; </p><p>  (4)鄰接表存儲(chǔ)結(jié)構(gòu)下圖的

16、結(jié)構(gòu)體定義如下:</p><p>  typedef struct Node </p><p><b>  {</b></p><p>  int dest; </p><p>  struct Node *next; </p><p><b>  }Edge; </b>

17、;</p><p>  typedef struct</p><p><b>  {</b></p><p>  DataType data; </p><p>  int sorce; </p><p>  Edge *adj; </p><p>  }AdjLH

18、eight; </p><p>  typedef struct</p><p><b>  {</b></p><p>  AdjLHeight a[MaxVertices]; </p><p>  int numOfVerts; </p><p>  int numOfEdges; &l

19、t;/p><p>  }AdjLGraph; </p><p>  (5)鄰接表存儲(chǔ)結(jié)構(gòu)下圖的邊信息結(jié)構(gòu)體定義如下:</p><p>  typedef struct</p><p><b>  {</b></p><p>  int row; </p><p>  int

20、 col; </p><p>  }RowCol; </p><p>  (6)順序循環(huán)隊(duì)列的結(jié)構(gòu)體定義如下:</p><p>  typedef struct </p><p><b>  {</b></p><p>  DataType queue[MaxQueueSize];</p

21、><p><b>  int rear;</b></p><p>  int front;</p><p>  int count;</p><p>  }SeqCQueue;</p><p>  (7)順序表的結(jié)構(gòu)體定義如下:</p><p>  typedef struct

22、</p><p><b>  {</b></p><p>  DataType list[MaxSize];</p><p><b>  int size;</b></p><p><b>  }SeqList;</b></p><p>  第四章 核心

23、代碼分析</p><p>  源程序存放在八個(gè)文件夾中,文件SeqList.h是順序表的結(jié)構(gòu)體定義和操作函數(shù),文件SeqCQueue.h是順序循環(huán)隊(duì)列的結(jié)構(gòu)體定義和操作函數(shù),文件AdjMGraph.h是鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的結(jié)構(gòu)體定義和操作函數(shù),文件AdjMGraphCreate.h是鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的創(chuàng)建函數(shù),文件AdjLGraph.h是鄰接表存儲(chǔ)結(jié)構(gòu)下圖的結(jié)構(gòu)體定義和操作函數(shù),文件AdjLGraphCre

24、ate.h是鄰接表存儲(chǔ)結(jié)構(gòu)下圖的創(chuàng)建函數(shù),文件AdjMGraphTraverse.h是鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的深度優(yōu)先遍歷和廣度優(yōu)先遍歷操作函數(shù),文件圖的基本操作與實(shí)現(xiàn).c是主函數(shù)。</p><p>  (1)/* 文件SeqList.h */</p><p>  typedef struct</p><p><b>  {</b></p&

25、gt;<p>  DataType list[MaxSize];</p><p><b>  int size;</b></p><p><b>  }SeqList;</b></p><p>  void ListInitiate(SeqList *L)</p><p><b&

26、gt;  {</b></p><p>  L->size=0;</p><p><b>  }</b></p><p>  int ListLength(SeqList L)</p><p><b>  {</b></p><p>  return L.si

27、ze;</p><p><b>  }</b></p><p>  int ListInsert(SeqList *L,int i,DataType x)</p><p><b>  {</b></p><p><b>  int j;</b></p><p

28、>  if(L->size>=MaxSize)</p><p><b>  {</b></p><p>  printf("數(shù)組已滿無(wú)法插入!\n");</p><p><b>  return 0;</b></p><p><b>  }</b

29、></p><p>  else if(i<0||i>L->size)</p><p><b>  {</b></p><p>  printf("參數(shù)不合法!\n");</p><p><b>  return 0;</b></p><

30、;p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  for(j=L->size;j>i;i--)L->list[j]=L->list[j-1];</p><p> 

31、 L->list[i]=x;</p><p>  L->size++;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int Lis

32、tDelete(SeqList *L,int i,DataType *x)</p><p><b>  {</b></p><p><b>  int j;</b></p><p>  if(L->size<=0)</p><p><b>  {</b></p

33、><p>  printf("順序表已空無(wú)數(shù)據(jù)元素可刪!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  else if(i<0||i>L->size-1)</p><

34、p><b>  {</b></p><p>  printf("參數(shù)i不合法!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  else</b>

35、</p><p><b>  {</b></p><p>  *x=L->list[i];</p><p>  for(j=i+1;j<=L->size-1;j++)L->list[j-1]=L->list[j];</p><p>  L->size--;</p><

36、;p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int ListGet(SeqList L,int i,DataType *x)</p><p><b>  {&l

37、t;/b></p><p>  if(i<0||i>L.size-1)</p><p><b>  {</b></p><p>  printf("參數(shù)i不合法!\n");</p><p><b>  return 0;</b></p><p

38、><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  *x=L.list[i];</p><p><b>  return 1;</b></p><p&

39、gt;<b>  }</b></p><p><b>  }</b></p><p>  (2)/* 文件SeqCQueue.h */</p><p>  typedef struct </p><p><b>  {</b></p><p>  Dat

40、aType queue[MaxQueueSize];</p><p><b>  int rear;</b></p><p>  int front;</p><p>  int count;</p><p>  }SeqCQueue;</p><p>  void QueueInitiate(S

41、eqCQueue *Q)</p><p><b>  {</b></p><p>  Q->rear=0;</p><p>  Q->front =0;</p><p>  Q->count =0;</p><p><b>  }</b></p>

42、<p>  int QueueNotEmpty(SeqCQueue Q)</p><p><b>  {</b></p><p>  if(Q.count !=0) return 1;</p><p>  else return 0;</p><p><b>  }</b></

43、p><p>  int QueueAppend(SeqCQueue *Q,DataType x)</p><p><b>  {</b></p><p>  if(Q->count>0&&Q->rear==Q->front)</p><p><b>  {</b>

44、</p><p>  printf("隊(duì)列已滿無(wú)法插入!");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  else </b></p><p><b

45、>  {</b></p><p>  Q->queue [Q->rear]=x;</p><p>  Q->rear =(Q->rear +1)%MaxQueueSize;</p><p>  Q->count ++;</p><p><b>  return 1;</b>

46、</p><p><b>  }</b></p><p><b>  }</b></p><p>  int QueueDelete(SeqCQueue *Q,DataType *d)</p><p><b>  {</b></p><p>  if(Q

47、->count ==0)</p><p><b>  {</b></p><p>  printf("隊(duì)列已空無(wú)數(shù)據(jù)出隊(duì)列!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p>

48、<p><b>  else</b></p><p><b>  {</b></p><p>  *d=Q->queue[Q->front];</p><p>  Q->front=(Q->front+1)%MaxQueueSize;</p><p>  Q-&g

49、t;count --;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int QueueGet(SeqCQueue Q,DataType*d)</p>&

50、lt;p><b>  {</b></p><p>  if(Q.count ==0)</p><p><b>  {</b></p><p>  printf("隊(duì)列已空無(wú)數(shù)據(jù)出隊(duì)列!\n");</p><p><b>  return 0;</b>&

51、lt;/p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  *d=Q.queue [Q.front ];</p><p><b>  return 1;<

52、;/b></p><p><b>  }</b></p><p><b>  }</b></p><p>  (3)/* 文件AdjMGraph.h*/</p><p>  #include"SeqList.h"</p><p>  typedef

53、struct</p><p><b>  {</b></p><p>  SeqList Vertices; //存放結(jié)點(diǎn)的順序表</p><p>  int edge[MaxVertices][MaxVertices]; //存放邊的鄰接矩陣</p><p>  int numOfEdges; //邊的條數(shù)<

54、;/p><p>  }AdjMGraph; //邊的結(jié)構(gòu)體定義</p><p>  void Initiate(AdjMGraph *G,int n) //初始化</p><p><b>  {</b></p><p><b>  int i,j;</b></p><p>

55、  for(i=0;i<n;i++)</p><p>  for(j=0;j<n;j++)</p><p><b>  {</b></p><p><b>  if(i==j)</b></p><p>  G->edge[i][j]=0;</p><p>&

56、lt;b>  else</b></p><p>  G->edge[i][j]=MaxWeight;</p><p><b>  }</b></p><p>  G->numOfEdges=0; //邊的條數(shù)置為0</p><p>  ListInitiate(&G->V

57、ertices); //順序表初始化</p><p><b>  }</b></p><p>  void InsertVertex(AdjMGraph *G,DataType vertex) //在圖G中插入結(jié)點(diǎn)vertex</p><p><b>  {</b></p><p>  List

58、Insert(&G->Vertices,G->Vertices.size,vertex); //順序表尾插入</p><p><b>  }</b></p><p>  void InsertEdge(AdjMGraph *G,int v1,int v2,int weight)</p><p>  //在圖G中插入邊<

59、;v1,v2>,邊<v1,v2>的權(quán)為weight</p><p><b>  {</b></p><p>  if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size)</p><p><b>  {</b><

60、;/p><p>  printf("參數(shù)v1或v2越界出錯(cuò)!\n");</p><p><b>  exit(1);</b></p><p><b>  }</b></p><p>  G->edge[v1][v2]=weight;</p><p>  

61、G->numOfEdges++;</p><p><b>  }</b></p><p>  void DeleteEdge(AdjMGraph *G,int v1,int v2) //在圖中刪除邊<v1,v2></p><p><b>  {</b></p><p>  if(

62、v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size||v1==v2)</p><p><b>  {</b></p><p>  printf("參數(shù)v1或v2越界出錯(cuò)!\n");</p><p><b>  exit(1);

63、</b></p><p><b>  }</b></p><p>  if(G->edge[v1][v2]==MaxWeight||v1==v2)</p><p><b>  {</b></p><p>  printf("該邊不存在!\n");</p&g

64、t;<p><b>  exit(0);</b></p><p><b>  }</b></p><p>  G->edge[v1][v2]=MaxWeight;</p><p>  G->numOfEdges--;</p><p><b>  }</b&g

65、t;</p><p>  void DeleteVerten(AdjMGraph *G,int v) //刪除結(jié)點(diǎn)v</p><p><b>  {</b></p><p>  int n=ListLength(G->Vertices),i,j; </p><p>  DataType x;</p>

66、<p>  for(i=0;i<n;i++) //計(jì)算刪除后的邊數(shù)</p><p><b>  {</b></p><p>  for(j=0;j<n;j++)</p><p>  if((i==v||j==v)&&G->edge[i][j]>0&&G->edge[i

67、][j]<MaxWeight)</p><p>  G->numOfEdges--; //計(jì)算被刪除邊</p><p><b>  }</b></p><p>  for(i=v;i<n;i++) //刪除第v行</p><p><b>  {</b></p>&

68、lt;p>  for(j=0;j<n;j++)</p><p>  G->edge[i][j]=G->edge[i+1][j];</p><p><b>  }</b></p><p>  for(i=0;i<n;i++) //刪除第v列</p><p><b>  {</

69、b></p><p>  for(j=v;j<n;j++)</p><p>  G->edge[i][j]=G->edge[i][j+1];</p><p><b>  }</b></p><p>  ListDelete(&G->Vertices,v,&x); //刪除結(jié)

70、點(diǎn)v</p><p><b>  }</b></p><p>  int GetFistVex(AdjMGraph *G,int v) </p><p>  //在圖G中尋找序號(hào)為v的結(jié)點(diǎn)的第一個(gè)鄰接結(jié)點(diǎn)</p><p>  //如果這樣的鄰接結(jié)點(diǎn)存在,返回該鄰接結(jié)點(diǎn)的序號(hào);否則,返回-1</p><

71、;p><b>  {</b></p><p><b>  int col;</b></p><p>  if(v<0||v>G->Vertices.size)</p><p><b>  {</b></p><p>  printf("參數(shù)v1

72、越界出錯(cuò)!\n");</p><p><b>  exit(1);</b></p><p><b>  }</b></p><p>  for(col=0;col<G->Vertices.size;col++)</p><p>  if(G->edge[v][col]&g

73、t;0&&G->edge[v][col]<MaxWeight)return col;</p><p>  return -1;</p><p><b>  }</b></p><p>  int GetNextVex(AdjMGraph*G,int v1,int v2)</p><p>  /

74、/在圖中尋找v1結(jié)點(diǎn)的鄰接結(jié)點(diǎn)v2的下一個(gè)鄰接結(jié)點(diǎn)</p><p>  //如果這樣的結(jié)點(diǎn)存在,返回該鄰接結(jié)點(diǎn)的序號(hào);否則,返回-1</p><p>  //v1和v2都是相應(yīng)結(jié)點(diǎn)的序號(hào)</p><p><b>  {</b></p><p><b>  int col;</b></p>

75、<p>  if(v1<0||v1>G->Vertices.size||v2<0||v2>G->Vertices.size)</p><p><b>  {</b></p><p>  printf("參數(shù)v1或v2越界出錯(cuò)!\n");</p><p>  exit(1);

76、 </p><p><b>  }</b></p><p>  for(col=v2+1;col<G->Vertices.size;col++)</p><p>  if(G->edge[v1][col]>0&&G->edge[v1][col]<MaxWeight)return col;&

77、lt;/p><p>  return -1;</p><p><b>  }</b></p><p>  //輸出圖G的鄰接矩陣</p><p>  void Print(AdjMGraph *G) </p><p><b>  {</b></p><p&g

78、t;<b>  int i,j;</b></p><p>  for(i=0;i<G->Vertices.size;i++)</p><p><b>  {</b></p><p>  for(j=0;j<G->Vertices.size;j++)</p><p>  pri

79、ntf("%6d ",G->edge[i][j]);</p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p><p>  //鄰接矩陣存儲(chǔ)結(jié)構(gòu)下求出每個(gè)頂點(diǎn)的度并輸出<

80、/p><p>  void MVertices(AdjMGraph *G,DataType a[]) </p><p><b>  {</b></p><p>  int i,j,m;</p><p>  DataType b[MaxVertices];//用數(shù)組b[]記錄相應(yīng)結(jié)點(diǎn)的度</p><p&g

81、t;  for(i=0;i<G->Vertices.size;i++)</p><p>  b[i]=0; //置0</p><p>  printf("鄰接矩陣存儲(chǔ)結(jié)構(gòu)下圖的頂點(diǎn)的度為:\n");</p><p>  for(m=0;m<G->Vertices.size;m++) //求出每個(gè)結(jié)點(diǎn)的度</p&g

82、t;<p><b>  {</b></p><p>  for(i=0;i<G->Vertices.size;i++)</p><p>  for(j=0;j<G->Vertices.size;j++)</p><p><b>  {</b></p><p> 

83、 if(i==m&&G->edge[i][j]>0&&G->edge[i][j]<MaxWeight)</p><p>  //求出鄰接矩陣第i行權(quán)值存在的邊的個(gè)數(shù),當(dāng)邊<m,j>存在時(shí),b[m]加1</p><p><b>  b[m]++;</b></p><p>  if

84、(j==m&&i!=m&&G->edge[i][j]>0&&G->edge[i][j]<MaxWeight)</p><p>  //求出鄰接矩陣第j列權(quán)值存在的邊的個(gè)數(shù),當(dāng)邊<i,m>存在時(shí),b[m]加1</p><p><b>  b[m]++;</b></p>&l

85、t;p><b>  }</b></p><p>  printf("頂點(diǎn)%d的度為:%d\n",a[m],b[m]);</p><p><b>  }</b></p><p><b>  }</b></p><p>  //查找圖G中是否存在點(diǎn)v<

86、;/p><p>  int ChaZhao(AdjMGraph *G,int v) </p><p><b>  {</b></p><p>  if(0<=v&&v<G->Vertices.size)</p><p><b>  {</b></p>&

87、lt;p>  printf("存在頂點(diǎn)%d\n",v);</p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b

88、></p><p>  printf("不存在頂點(diǎn)%d\n",v);</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  /

89、/刪除查找到的結(jié)點(diǎn)v并刪除該結(jié)點(diǎn)及與之相關(guān)的邊</p><p>  void MDelete(AdjMGraph *G,int v)</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  for(i=0;i<G->Vertices.

90、size;i++)</p><p><b>  {</b></p><p>  if(G->edge[v][i]>0&&G->edge[v][i]<MaxWeight)</p><p>  //當(dāng)鄰接矩陣的第v行有邊<v,i>存在時(shí),刪除邊<v,i></p><

91、p>  DeleteEdge(G,v,i);</p><p>  if(G->edge[i][v]>0&&G->edge[i][v]<MaxWeight)</p><p>  //當(dāng)鄰接矩陣的第j行有邊<i,v>存在時(shí),刪除邊<i,v></p><p>  DeleteEdge(G,i,v);&l

92、t;/p><p><b>  }</b></p><p>  DeleteVerten(G,v);//刪除結(jié)點(diǎn)v</p><p><b>  }</b></p><p>  (4)/* 文件AdjMGraphCreate.h */</p><p>  typedef struct

93、</p><p><b>  {</b></p><p>  int row; //行下標(biāo)</p><p>  int col; //列下標(biāo)</p><p>  int weight; //權(quán)值</p><p>  }RowColWeight; //邊信息結(jié)構(gòu)體定義</p>

94、<p>  void CreatGraph(AdjMGraph *G,DataType v[],int n,RowColWeight E[],int e)</p><p>  //在圖G中插入n個(gè)結(jié)點(diǎn)信息v和e條邊信息E</p><p><b>  {</b></p><p><b>  int i,k;</b>

95、</p><p>  Initiate(G,n); //結(jié)點(diǎn)順序表初始化</p><p>  for(i=0;i<n;i++)</p><p>  InsertVertex(G,v[i]); //結(jié)點(diǎn)插入</p><p>  for(k=0;k<e;k++)</p><p>  InsertEdge(G

96、,E[k].row,E[k].col,E[k].weight); //邊插入</p><p><b>  }</b></p><p>  (5)/* 文件AdjLGraph.h */</p><p>  //鄰接表的存儲(chǔ)結(jié)構(gòu)</p><p>  typedef struct Node </p><

97、p><b>  {</b></p><p>  int dest; //鄰接邊的弧頭結(jié)點(diǎn)序號(hào)</p><p>  struct Node *next; </p><p>  }Edge; //鄰接邊單鏈表的結(jié)點(diǎn)結(jié)構(gòu)體</p><p>  typedef struct</p><p>&

98、lt;b>  {</b></p><p>  DataType data; //結(jié)點(diǎn)數(shù)據(jù)元素 </p><p>  int sorce; //鄰接邊的弧尾結(jié)點(diǎn)序號(hào)</p><p>  Edge *adj; //鄰接邊的頭指針</p><p>  }AdjLHeight; //數(shù)組的數(shù)據(jù)元素類(lèi)型結(jié)構(gòu)體</p>

99、;<p>  typedef struct</p><p><b>  {</b></p><p>  AdjLHeight a[MaxVertices]; //鄰接表數(shù)組</p><p>  int numOfVerts; //結(jié)點(diǎn)個(gè)數(shù)</p><p>  int numOfEdges; //邊個(gè)數(shù)

100、</p><p>  }AdjLGraph; //鄰接表結(jié)構(gòu)體</p><p><b>  //初始化操作函數(shù)</b></p><p>  void LAdjInitiate(AdjLGraph *G)</p><p><b>  {</b></p><p><b&g

101、t;  int i;</b></p><p>  G->numOfVerts=0;</p><p>  G->numOfEdges=0;</p><p>  for(i=0;i<MaxVertices;i++)</p><p><b>  {</b></p><p>

102、  G->a[i].sorce=i;</p><p>  G->a[i].adj=NULL;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //撤銷(xiāo)操作函數(shù)</b></p><p>

103、;  void LAdjDestroy(AdjLGraph *G)</p><p>  //撤銷(xiāo)圖G中的所有鄰接邊單鏈表</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  Edge *p,*q;</p><p>  

104、for(i=0;i<G->numOfVerts;i++)</p><p><b>  {</b></p><p>  p=G->a[i].adj;</p><p>  while(p!=NULL)</p><p><b>  {</b></p><p>  

105、q=p->next;</p><p><b>  free(p);</b></p><p><b>  p=q;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><

106、b>  }</b></p><p>  //插入結(jié)點(diǎn)操作函數(shù)</p><p>  void LInsertVertex(AdjLGraph *G,int i,DataType vertex)</p><p>  //在圖G中的第i(0<=i<MaxVertices)個(gè)位置插入結(jié)點(diǎn)數(shù)據(jù)元素vertex</p><p&g

107、t;<b>  {</b></p><p>  if(i>=0&&i<MaxVertices)</p><p><b>  {</b></p><p>  G->a[i].data=vertex; //存儲(chǔ)結(jié)點(diǎn)數(shù)據(jù)元素vertex</p><p>  G->

108、numOfVerts++; //個(gè)數(shù)加1</p><p><b>  }</b></p><p><b>  else</b></p><p>  printf("結(jié)點(diǎn)越界");</p><p><b>  }</b></p><

109、;p><b>  //插入邊操作函數(shù)</b></p><p>  void LInsertEdge(AdjLGraph *G,int v1,int v2)</p><p>  //在圖G中加入邊<v1,v2>的信息</p><p><b>  {</b></p><p>  Edg

110、e *p; //定義一個(gè)鄰接邊指針</p><p>  if(v1<0||v1>=G->numOfVerts||v2<0||v2>=G->numOfVerts)</p><p><b>  {</b></p><p>  printf("參數(shù)v1或v2越界出錯(cuò)");</p>

111、<p><b>  exit(0);</b></p><p><b>  }</b></p><p>  p=(Edge *)malloc(sizeof(Edge)); //申請(qǐng)鄰接邊單鏈表結(jié)點(diǎn)空間</p><p>  p->dest=v2; //置鄰接邊弧頭序號(hào)</p><p&g

112、t;  p->next=G->a[v1].adj; //新結(jié)點(diǎn)插入單鏈表的表頭</p><p>  G->a[v1].adj=p; //頭指針指向新的單鏈表表頭</p><p>  G->numOfEdges++; //邊數(shù)個(gè)數(shù)加1</p><p><b>  } </b></p><p>

113、<b>  //刪除邊操作函數(shù)</b></p><p>  void LDeleteEdge(AdjLGraph *G,int v1,int v2)</p><p>  //刪除圖G中的邊<v1,v2>信息</p><p><b>  {</b></p><p>  Edge *curr

114、,*pre;</p><p>  if(v1<0||v1>=G->numOfVerts||v2<0||v2>=G->numOfVerts)</p><p><b>  {</b></p><p>  printf("參數(shù)v1或v2越界出錯(cuò)!");</p><p>&

115、lt;b>  exit(0);</b></p><p><b>  }</b></p><p><b>  pre=NULL;</b></p><p>  curr=G->a[v1].adj;</p><p>  while(curr!=NULL&&curr-

116、>dest!=v2)</p><p>  //在v1結(jié)點(diǎn)的鄰接邊單鏈表中查找v2結(jié)點(diǎn)</p><p><b>  {</b></p><p><b>  pre=curr;</b></p><p>  curr=curr->next;</p><p><b&

117、gt;  }</b></p><p>  //刪除表示鄰接邊<v1,v2>的結(jié)點(diǎn)</p><p>  if(curr!=NULL&&curr->dest==v2&&pre==NULL)</p><p>  //當(dāng)鄰接邊<v1,v2>的結(jié)點(diǎn)是單鏈表的第一個(gè)結(jié)點(diǎn)時(shí)</p><p

118、><b>  {</b></p><p>  G->a[v1].adj=curr->next;</p><p>  free(curr);</p><p>  G->numOfEdges--;</p><p><b>  }</b></p><p> 

119、 else if(curr!=NULL&&curr->dest==v2&&pre!=NULL)</p><p>  //當(dāng)鄰接邊<v1,v2>的結(jié)點(diǎn)不是單鏈表的第一個(gè)結(jié)點(diǎn)時(shí)</p><p><b>  {</b></p><p>  pre->next=curr->next;<

120、;/p><p>  free(curr);</p><p>  G->numOfEdges--;</p><p><b>  }</b></p><p><b>  else</b></p><p>  //當(dāng)鄰接邊<v1,v2>結(jié)點(diǎn)不存在時(shí)</p>

121、<p>  printf("邊<v1,v2>不存在時(shí)");</p><p><b>  }</b></p><p>  //取第一個(gè)鄰接結(jié)點(diǎn)</p><p>  int LGetFirstVex(AdjLGraph *G,int v)</p><p>  //取圖G中結(jié)點(diǎn)v的

122、第一個(gè)鄰接結(jié)點(diǎn)</p><p>  //取到時(shí)返回該鄰接結(jié)點(diǎn)的對(duì)應(yīng)序號(hào),否則返回-1</p><p><b>  {</b></p><p><b>  Edge *p;</b></p><p>  if(v<0||v>G->numOfVerts)</p><p

123、><b>  {</b></p><p>  printf("參數(shù)v1或v2越界出錯(cuò)!");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  p=G->a[v].adj;</

124、p><p>  if(p!=NULL)</p><p>  return p->dest; //返回該鄰接結(jié)點(diǎn)的對(duì)應(yīng)序號(hào)</p><p><b>  else</b></p><p>  return -1; //返回-1</p><p><b>  }</b><

125、/p><p>  //取下一個(gè)鄰接結(jié)點(diǎn)</p><p>  int LGetNextVex(AdjLGraph *G,int v1,int v2)</p><p>  //取圖G中結(jié)點(diǎn)v1的鄰接結(jié)點(diǎn)v2的下一個(gè)鄰接結(jié)點(diǎn)</p><p>  //取到時(shí)返回該鄰接結(jié)點(diǎn)的對(duì)應(yīng)序號(hào),否則返回-1</p><p><b>

126、  {</b></p><p><b>  Edge *p;</b></p><p>  if(v1<0||v1>G->numOfVerts||v2<0||v2>G->numOfVerts)</p><p><b>  {</b></p><p>  

127、printf("參數(shù)v1或v2越界出錯(cuò)!");</p><p><b>  exit(0);</b></p><p><b>  }</b></p><p>  p=G->a[v1].adj;</p><p>  while(p!=NULL) //尋找結(jié)點(diǎn)v1的鄰接結(jié)點(diǎn)v

128、2</p><p><b>  {</b></p><p>  if(p->dest!=v2)</p><p><b>  {</b></p><p>  p=p->next;</p><p><b>  continue;</b></

129、p><p><b>  }</b></p><p><b>  else</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  p=p->next; //p指向鄰接

130、結(jié)點(diǎn)v2的下一個(gè)鄰接結(jié)點(diǎn)</p><p>  if(p!=NULL)</p><p>  return p->dest; //返回該鄰接結(jié)點(diǎn)的對(duì)應(yīng)序號(hào)</p><p><b>  else</b></p><p>  return -1; //返回-1</p><p><b>

131、  }</b></p><p>  //鄰接表存儲(chǔ)下求每個(gè)頂點(diǎn)的度并輸出結(jié)果</p><p>  void LVertices(AdjLGraph *G,DataType a[])</p><p><b>  {</b></p><p>  printf("鄰接表存儲(chǔ)結(jié)構(gòu)下的圖的頂點(diǎn)的度為:\n&q

132、uot;);</p><p>  int OutDegree[MaxVertices],InDegree[MaxVertices];//定義一個(gè)出度和入度的數(shù)組</p><p><b>  int i;</b></p><p>  for(i=0;i<G->numOfVerts;i++) //首先將出度和入度數(shù)組的每個(gè)成員都置0&

133、lt;/p><p><b>  {</b></p><p>  OutDegree[i]=0;</p><p>  InDegree[i]=0;</p><p><b>  }</b></p><p>  Edge *p; //定義一個(gè)鄰接邊指針</p><

134、p>  for(i=0;i<G->numOfVerts;i++)</p><p><b>  {</b></p><p>  p=G->a[i].adj; //指針指向a[i]的鄰接邊單鏈表頭結(jié)點(diǎn)</p><p>  while(p!=NULL)//當(dāng)p所指向的鄰接邊結(jié)點(diǎn)不空時(shí)</p><p>

135、<b>  {</b></p><p>  OutDegree[i]++; //出度加1</p><p>  InDegree[p->dest]++; //鄰接邊弧頭結(jié)點(diǎn)的入度加1</p><p>  p=p->next; //p指向下一個(gè)鄰接邊結(jié)點(diǎn)</p><p><b>  }</b>

136、;</p><p><b>  }</b></p><p>  for(i=0;i<G->numOfVerts;i++) //輸出每個(gè)結(jié)點(diǎn)的度</p><p><b>  {</b></p><p>  printf("頂點(diǎn)%d的度為:",a[i]);</p&g

137、t;<p>  printf("%d",OutDegree[i]+InDegree[i]); //每個(gè)結(jié)點(diǎn)的度即出度與入度相加的和</p><p>  printf("\n");</p><p><b>  }</b></p><p><b>  }</b></p

138、><p>  //判斷有向圖G是否為強(qiáng)連通圖</p><p>  int LianTong(AdjLGraph *G,DataType a[]) </p><p><b>  {</b></p><p>  int i,b[MaxVertices],k=0;</p><p>  for(i=0;i&l

139、t;G->numOfVerts;i++)</p><p><b>  b[i]=0;</b></p><p>  Edge *q,*p; //定義一個(gè)鄰接邊指針</p><p>  for(i=0;i<G->numOfVerts;i++)</p><p><b>  {</b>&

140、lt;/p><p>  q=G->a[i].adj;</p><p>  while(q!=NULL)</p><p><b>  {</b></p><p><b>  b[i]++;</b></p><p>  q=q->next;</p><

141、p><b>  }</b></p><p><b>  }</b></p><p>  for(i=0;i<G->numOfVerts;i++)</p><p><b>  {</b></p><p>  if(b[i]==1)</p><

142、p><b>  k++;</b></p><p><b>  }</b></p><p>  p=G->a[G->numOfVerts-1].adj;</p><p>  if(k==G->numOfVerts&&p->dest==a[0])</p><p&

143、gt;<b>  return 1;</b></p><p><b>  else</b></p><p><b>  return 0;</b></p><p><b>  }</b></p><p>  (6)/* 文件AdjLGraphCreate.

144、h */</p><p>  typedef struct</p><p><b>  {</b></p><p>  int row; //行下標(biāo)</p><p>  int col; //列下標(biāo)</p><p>  }RowCol; //邊信息結(jié)構(gòu)體定義</p><p

145、>  void CreatLGraph(AdjLGraph *G,DataType v[],int n,RowCol d[],int e)</p><p><b>  {</b></p><p><b>  int i,k;</b></p><p>  LAdjInitiate(G);</p><

146、p>  for(i=0;i<n;i++)</p><p>  LInsertVertex(G,i,v[i]);</p><p>  for(k=0;k<e;k++)</p><p>  LInsertEdge(G,d[k].row,d[k].col);</p><p><b>  }</b></p

147、><p>  (7)/* 文件AdjMGraphTraverse.h */</p><p>  void Visit(DataType item)</p><p><b>  {</b></p><p>  printf("%d ",item);</p><p><b>

148、  }</b></p><p>  void DepthFSearch(AdjMGraph G,int v,int visited[],void Visit(DataType item))</p><p>  //連通圖G以v為初始結(jié)點(diǎn)的訪問(wèn)操作為Visit()的深度優(yōu)先遍歷</p><p>  //數(shù)組visited標(biāo)記了相應(yīng)結(jié)點(diǎn)是否已訪問(wèn)過(guò),0表示未

149、訪問(wèn),1表示已訪問(wèn)</p><p><b>  {</b></p><p><b>  int w;</b></p><p>  Visit(G.Vertices.list[v]); //訪問(wèn)結(jié)點(diǎn)v</p><p>  visited[v]=1; //置已訪問(wèn)標(biāo)記</p><

溫馨提示

  • 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)論