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

下載本文檔

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

文檔簡介

1、<p><b>  數(shù)據(jù)結(jié)構(gòu)</b></p><p><b>  課程設(shè)計報告</b></p><p>  設(shè)計題目: 圖的基本操作與實現(xiàn)</p><p>  專 業(yè) </p><p>  班 級 </p><p>  學(xué)

2、 生 </p><p>  學(xué) 號 </p><p>  指導(dǎo)教師 </p><p>  起止時間 </p><p><b>  年 學(xué)期</b></p><p><b>  目

3、錄</b></p><p>  1.問題描述:實現(xiàn)圖的一些基本操作3</p><p><b>  2.基本要求:3</b></p><p>  (2)求每個頂點(diǎn)的度,輸出結(jié)果;3</p><p><b>  3.測試數(shù)據(jù):3</b></p><p><

4、;b>  4.算法思想:3</b></p><p>  (1)自選存儲結(jié)構(gòu)創(chuàng)建一個圖:3</p><p>  (2)求每個頂點(diǎn)的度:3</p><p>  (3)圖的深度優(yōu)先遍歷:4</p><p>  (4)圖的廣度優(yōu)先遍歷:4</p><p>  (5)判斷有向圖的強(qiáng)連通性:4<

5、/p><p>  (6)用鄰接矩陣的信息生成鄰接表:4</p><p><b>  6.數(shù)據(jù)結(jié)構(gòu):5</b></p><p><b>  7.功能模塊圖7</b></p><p><b>  8.源程序:8</b></p><p>  9.心得體會:

6、28</p><p>  1.問題描述:實現(xiàn)圖的一些基本操作</p><p><b>  2.基本要求:</b></p><p>  (1)自選存儲結(jié)構(gòu),輸入含n個頂點(diǎn)(用字符表示頂點(diǎn))和e條邊的圖G;</p><p>  (2)求每個頂點(diǎn)的度,輸出結(jié)果;</p><p>  (3)指定任意頂點(diǎn)

7、x為初始頂點(diǎn),對圖G作DFS遍歷,輸出DFS頂點(diǎn)序列(提示:使用一個棧實現(xiàn)DFS);</p><p>  (4)指定任意頂點(diǎn)x為初始頂點(diǎn),對圖G作BFS遍歷,輸出BFS頂點(diǎn)序列(提示:使用一個隊列實現(xiàn)BFS);</p><p>  (5)輸入頂點(diǎn)x,查找圖G:若存在含x的頂點(diǎn),則刪除該結(jié)點(diǎn)及與之相關(guān)連的邊,并作DFS遍歷(執(zhí)行操作3);否則輸出信 息“無x”;</p><

8、;p>  (6)判斷圖G是否是連通圖,輸出信息“YES”/“NO”;</p><p>  (7)如果選用的存儲結(jié)構(gòu)是鄰接矩陣,則用鄰接矩陣的信息生成圖G的鄰接表,即復(fù)制圖G,然再執(zhí)行操作(2);反之亦然。</p><p><b>  3.測試數(shù)據(jù):</b></p><p>  有向圖的頂點(diǎn)數(shù)n和有向圖的邊數(shù)e由用戶從鍵盤敲入</p&

9、gt;<p><b>  4.算法思想:</b></p><p>  (1)自選存儲結(jié)構(gòu)創(chuàng)建一個圖:通過用戶從鍵盤敲入的兩個數(shù)值分別確定圖的頂點(diǎn)數(shù)和邊數(shù),選擇鄰接矩陣存儲結(jié)構(gòu)將圖的結(jié)點(diǎn)信息存儲在一個順序表中,圖的邊信息存儲在一個二維數(shù)組中。</p><p>  (2)求每個頂點(diǎn)的度:</p><p>  1.鄰接矩陣存儲結(jié)構(gòu)下求每

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

11、遍歷:采取鄰接矩陣結(jié)構(gòu),指定任意頂點(diǎn)x為初始頂點(diǎn)</p><p>  1.訪問結(jié)點(diǎn)v并標(biāo)記結(jié)點(diǎn)v已訪問;</p><p>  2.查找結(jié)點(diǎn)v的第一個鄰接結(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尚未被訪問,則遞歸訪問結(jié)點(diǎn)w;</p><p>

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

13、p>  3.當(dāng)隊列非空時則繼續(xù)執(zhí)行,否則算法結(jié)束;</p><p>  4.出隊列取得隊頭結(jié)點(diǎn)u;</p><p>  5.查找u的第一個鄰接結(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尚未被訪問,則訪問結(jié)點(diǎn)w并標(biāo)記結(jié)點(diǎn)w為已訪問;</p>

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

15、構(gòu)體,將鄰接矩陣的邊信息轉(zhuǎn)換成鄰接表的邊信息存儲到鄰接邊的單鏈表中。</p><p><b>  5.模塊劃分:</b></p><p>  mian():主函數(shù)模塊。在主函數(shù)模塊中調(diào)用以下函數(shù):</p><p>  void CreatGraph(AdjMGraph *G,DataType v[],int n,RowColWeight E[]

16、,int e):創(chuàng)建一個鄰接矩陣存儲結(jié)構(gòu)的圖;</p><p>  void Print(AdjMGraph *G):輸出圖的鄰接矩陣;</p><p>  void MVertices(AdjMGraph *G,DataType a[]):求出鄰接矩陣存儲結(jié)構(gòu)下圖的每個頂點(diǎn)的度;</p><p>  void CreatLGraph(AdjLGraph *G,Da

17、taType v[],int n,RowCol d[],int e):用鄰接矩陣的信息生成鄰接表;</p><p>  void LVertices(AdjLGraph *G,DataType a[]):求出鄰接表存儲結(jié)構(gòu)下圖的每個頂點(diǎn)的度;</p><p>  int LianTong(AdjLGraph *G,DataType a[]):判斷有向圖的強(qiáng)連通性;</p>&

18、lt;p>  void DepthFirstSearch(AdjMGraph G,void Visit(DataType item)):對圖作DFS遍歷,輸出DFS頂點(diǎn)序列;</p><p>  void BroadFirstSearch(AdjMGraph G,void Visit(DataType item)):對圖作BFS遍歷,輸出BFS頂點(diǎn)序列;</p><p>  int

19、ChaZhao(AdjMGraph *G,int v):查找頂點(diǎn)v;</p><p>  void MDelete(AdjMGraph *G,int v):刪除查找到的結(jié)點(diǎn)v并刪除該結(jié)點(diǎn)及與之相關(guān)的邊;</p><p><b>  6.數(shù)據(jù)結(jié)構(gòu):</b></p><p>  (1)有向圖頂點(diǎn)的數(shù)據(jù)類型DataType 定義如下:</p&g

20、t;<p>  typedef int DataType ;</p><p>  (2)鄰接矩陣存儲結(jié)構(gòu)下圖的結(jié)構(gòu)體定義如下:</p><p>  typedef struct</p><p><b>  {</b></p><p>  SeqList Vertices; //存放結(jié)點(diǎn)的順序表</p&

21、gt;<p>  int edge[MaxVertices][MaxVertices]; //存放邊的鄰接矩陣</p><p>  int numOfEdges; //邊的條數(shù)</p><p>  }AdjMGraph; //邊的結(jié)構(gòu)體定義</p><p>  (3)鄰接矩陣存儲結(jié)構(gòu)下圖的邊信息結(jié)構(gòu)體定義如下:</p><p&g

22、t;  typedef struct</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é)

23、構(gòu)體定義</p><p>  (4)鄰接表存儲結(jié)構(gòu)下圖的結(jié)構(gòu)體定義如下:</p><p>  typedef struct Node </p><p><b>  {</b></p><p>  int dest; //鄰接邊的弧頭結(jié)點(diǎn)序號</p><p>  struct Node *nex

24、t; </p><p>  }Edge; //鄰接邊單鏈表的結(jié)點(diǎn)結(jié)構(gòu)體</p><p>  typedef struct</p><p><b>  {</b></p><p>  DataType data; //結(jié)點(diǎn)數(shù)據(jù)元素 </p><p>  int sorce; //鄰接邊的弧尾結(jié)

25、點(diǎn)序號</p><p>  Edge *adj; //鄰接邊的頭指針</p><p>  }AdjLHeight; //數(shù)組的數(shù)據(jù)元素類型結(jié)構(gòu)體</p><p>  typedef struct</p><p><b>  {</b></p><p>  AdjLHeight a[MaxVert

26、ices]; //鄰接表數(shù)組</p><p>  int numOfVerts; //結(jié)點(diǎn)個數(shù)</p><p>  int numOfEdges; //邊個數(shù)</p><p>  }AdjLGraph; //鄰接表結(jié)構(gòu)體</p><p>  (5)鄰接表存儲結(jié)構(gòu)下圖的邊信息結(jié)構(gòu)體定義如下:</p><p>  

27、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>  (6)順序循環(huán)隊列的結(jié)構(gòu)體定義如下:<

28、;/p><p>  typedef struct </p><p><b>  {</b></p><p>  DataType queue[MaxQueueSize];</p><p><b>  int rear;</b></p><p>  int front;</p

29、><p>  int count;</p><p>  }SeqCQueue;</p><p>  (7)順序表的結(jié)構(gòu)體定義如下:</p><p>  typedef struct</p><p><b>  {</b></p><p>  DataType list[MaxS

30、ize];</p><p><b>  int size;</b></p><p><b>  }SeqList;</b></p><p><b>  7.功能模塊圖:</b></p><p><b>  8.源程序:</b></p><

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

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

33、aType list[MaxSize];</p><p><b>  int size;</b></p><p><b>  }SeqList;</b></p><p>  void ListInitiate(SeqList *L)</p><p><b>  {</b><

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

35、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>  if(L->size

36、>=MaxSize)</p><p><b>  {</b></p><p>  printf("數(shù)組已滿無法插入!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><

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

38、lt;/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>  L->list[i]=x;&l

39、t;/p><p>  L->size++;</p><p><b>  return 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int ListDelete(SeqList *L,

40、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><p>  pr

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

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

43、t;<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><p><b>  re

44、turn 1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int ListGet(SeqList L,int i,DataType *x)</p><p><b>  {</b></p>

45、<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><b>  }<

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

47、/b></p><p><b>  }</b></p><p>  (2)/* 文件SeqCQueue.h */</p><p>  typedef struct </p><p><b>  {</b></p><p>  DataType queue[MaxQueu

48、eSize];</p><p><b>  int rear;</b></p><p>  int front;</p><p>  int count;</p><p>  }SeqCQueue;</p><p>  void QueueInitiate(SeqCQueue *Q)</p&

49、gt;<p><b>  {</b></p><p>  Q->rear=0;</p><p>  Q->front =0;</p><p>  Q->count =0;</p><p><b>  }</b></p><p>  int Qu

50、eueNotEmpty(SeqCQueue Q)</p><p><b>  {</b></p><p>  if(Q.count !=0) return 1;</p><p>  else return 0;</p><p><b>  }</b></p><p>  i

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

52、t;  printf("隊列已滿無法插入!");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  else </b></p><p><b>  {</b>&l

53、t;/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></p><p&g

54、t;<b>  }</b></p><p><b>  }</b></p><p>  int QueueDelete(SeqCQueue *Q,DataType *d)</p><p><b>  {</b></p><p>  if(Q->count ==0)<

55、/p><p><b>  {</b></p><p>  printf("隊列已空無數(shù)據(jù)出隊列!\n");</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>

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

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

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

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

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

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

62、 }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>  for(i=0;i<n;i+

63、+)</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><b>  else</

64、b></p><p>  G->edge[i][j]=MaxWeight;</p><p><b>  }</b></p><p>  G->numOfEdges=0; //邊的條數(shù)置為0</p><p>  ListInitiate(&G->Vertices); //順序表初始化

65、</p><p><b>  }</b></p><p>  void InsertVertex(AdjMGraph *G,DataType vertex) //在圖G中插入結(jié)點(diǎn)vertex</p><p><b>  {</b></p><p>  ListInsert(&G->V

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

67、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></p><p> 

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

69、</p><p><b>  }</b></p><p>  void DeleteEdge(AdjMGraph *G,int v1,int v2) //在圖中刪除邊<v1,v2></p><p><b>  {</b></p><p>  if(v1<0||v1>G-&g

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

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

72、gt;  exit(0);</b></p><p><b>  }</b></p><p>  G->edge[v1][v2]=MaxWeight;</p><p>  G->numOfEdges--;</p><p><b>  }</b></p><p

73、>  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><p>  for(i=

74、0;i<n;i++) //計算刪除后的邊數(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][j]<MaxWeight)&

75、lt;/p><p>  G->numOfEdges--; //計算被刪除邊</p><p><b>  }</b></p><p>  for(i=v;i<n;i++) //刪除第v行</p><p><b>  {</b></p><p>  for(j=0;j

76、<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>  {</b></p>&l

77、t;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é)點(diǎn)v</p><p

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

79、lt;/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越界出錯!\n");<

80、/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]>0&&G->

81、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>  //在圖中尋找v1結(jié)點(diǎn)的鄰接結(jié)點(diǎn)v2的下

82、一個鄰接結(jié)點(diǎn)</p><p>  //如果這樣的結(jié)點(diǎn)存在,返回該鄰接結(jié)點(diǎn)的序號;否則,返回-1</p><p>  //v1和v2都是相應(yīng)結(jié)點(diǎn)的序號</p><p><b>  {</b></p><p><b>  int col;</b></p><p>  if(v1&

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

84、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;</p><p>

85、;  return -1;</p><p><b>  }</b></p><p>  //輸出圖G的鄰接矩陣</p><p>  void Print(AdjMGraph *G) </p><p><b>  {</b></p><p><b>  int i,

86、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>  printf("%6d "

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

88、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>  for(i=0;i<G-

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

90、gt;  {</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>  if(i==m&&G

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

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

93、</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</p><p> 

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

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

96、;p>  printf("不存在頂點(diǎn)%d\n",v);</p><p><b>  return 0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  //刪除查找到的結(jié)點(diǎn)v并刪除該結(jié)點(diǎn)及與之

97、相關(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.size;i++)</p>

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

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

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

101、t;<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><p>  void Cre

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

103、t;  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,E[k].row,E[k].col,

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

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

106、t;</p><p>  DataType data; //結(jié)點(diǎn)數(shù)據(jù)元素 </p><p>  int sorce; //鄰接邊的弧尾結(jié)點(diǎn)序號</p><p>  Edge *adj; //鄰接邊的頭指針</p><p>  }AdjLHeight; //數(shù)組的數(shù)據(jù)元素類型結(jié)構(gòu)體</p><p>  typed

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

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

109、;</p><p>  G->numOfVerts=0;</p><p>  G->numOfEdges=0;</p><p>  for(i=0;i<MaxVertices;i++)</p><p><b>  {</b></p><p>  G->a[i].sorce=

110、i;</p><p>  G->a[i].adj=NULL;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //撤銷操作函數(shù)</b></p><p>  void LAdjDestroy

111、(AdjLGraph *G)</p><p>  //撤銷圖G中的所有鄰接邊單鏈表</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  Edge *p,*q;</p><p>  for(i=0;i<G->

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

113、><p><b>  free(p);</b></p><p><b>  p=q;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b>&

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

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

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

117、插入邊操作函數(shù)</b></p><p>  void LInsertEdge(AdjLGraph *G,int v1,int v2)</p><p>  //在圖G中加入邊<v1,v2>的信息</p><p><b>  {</b></p><p>  Edge *p; //定義一個鄰接邊指針&

118、lt;/p><p>  if(v1<0||v1>=G->numOfVerts||v2<0||v2>=G->numOfVerts)</p><p><b>  {</b></p><p>  printf("參數(shù)v1或v2越界出錯");</p><p><b>

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

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

121、數(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,*pre;</p>&

122、lt;p>  if(v1<0||v1>=G->numOfVerts||v2<0||v2>=G->numOfVerts)</p><p><b>  {</b></p><p>  printf("參數(shù)v1或v2越界出錯!");</p><p><b>  exit(0);&

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

124、><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>  }</b><

125、;/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)是單鏈表的第一個結(jié)點(diǎn)時</p><p><b>  {<

126、;/b></p><p>  G->a[v1].adj=curr->next;</p><p>  free(curr);</p><p>  G->numOfEdges--;</p><p><b>  }</b></p><p>  else if(curr!=NULL

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

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

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

130、<p>  //取到時返回該鄰接結(jié)點(diǎn)的對應(yīng)序號,否則返回-1</p><p><b>  {</b></p><p><b>  Edge *p;</b></p><p>  if(v<0||v>G->numOfVerts)</p><p><b>  {<

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

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

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

134、><p><b>  Edge *p;</b></p><p>  if(v1<0||v1>G->numOfVerts||v2<0||v2>G->numOfVerts)</p><p><b>  {</b></p><p>  printf("參數(shù)v1或v

135、2越界出錯!");</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)v2</p><p&

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

137、;b>  }</b></p><p><b>  else</b></p><p><b>  break;</b></p><p><b>  }</b></p><p>  p=p->next; //p指向鄰接結(jié)點(diǎn)v2的下一個鄰接結(jié)點(diǎn)</p&

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

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

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

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

142、;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)不空時</p><p><b>  {</b&

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

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

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

146、判斷有向圖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<G->numOfVerts;

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

148、;  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><p><b>  }&l

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論