第十一周项目实践2 用邻接表存储的图来实现基本应用
生活随笔
收集整理的這篇文章主要介紹了
第十一周项目实践2 用邻接表存储的图来实现基本应用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
假設圖G采用鄰接表存儲,分別設計實現以下要求的算法:?
(1)輸出出圖G中每個頂點的出度;?
(2)求出圖G中出度最大的一個頂點,輸出該頂點編號;?
(3)計算圖G中出度為0的頂點數;?
(4)判斷圖G中是否存在邊<i,j>。?
利用下圖作為測試用圖,輸出結果。
#ifndef GRAPH_H_INCLUDED #define GRAPH_H_INCLUDED#define MAXV 100 //最大頂點個數 #define INF 32767 //INF表示∞ typedef int InfoType;//以下定義鄰接矩陣類型 typedef struct {int no; //頂點編號InfoType info; //頂點其他信息,在此存放帶權圖權值 } VertexType; //頂點類型typedef struct //圖的定義 {int edges[MAXV][MAXV]; //鄰接矩陣int n,e; //頂點數,弧數VertexType vexs[MAXV]; //存放頂點信息 } MGraph; //圖的鄰接矩陣類型 //以下定義鄰接表類型 typedef struct ANode //弧的結點結構類型 {int adjvex; //該弧的終點位置struct ANode *nextarc; //指向下一條弧的指針InfoType info; //該弧的相關信息,這里用于存放權值 } ArcNode;typedef int Vertex;typedef struct Vnode //鄰接表頭結點的類型 {Vertex data; //頂點信息int count; //存放頂點入度,只在拓撲排序中用ArcNode *firstarc; //指向第一條弧 } VNode;typedef VNode AdjList[MAXV]; //AdjList是鄰接表類型typedef struct {AdjList adjlist; //鄰接表int n,e; //圖中頂點數n和邊數e } ALGraph; //圖的鄰接表類型 void ArrayToList(int *Arr, int n, ALGraph *&); //用普通數組構造圖的鄰接表 #endif // GRAPH_H_INCLUDED graph.cpp#include <stdio.h> #include <malloc.h> #include "graph.h" //功能:由一個反映圖中頂點鄰接關系的二維數組,構造出用鄰接矩陣存儲的圖 //參數:Arr - 數組名,由于形式參數為二維數組時必須給出每行的元素個數,在此將參數Arr聲明為一維數組名(指向int的指針) // n - 矩陣的階數 // g - 要構造出來的鄰接矩陣數據結構 void ArrayToList(int *Arr, int n, ALGraph *&G) {int i,j,count=0; //count用于統計邊數,即矩陣中非0元素個數ArcNode *p;G=(ALGraph *)malloc(sizeof(ALGraph));G->n=n;for (i=0; i<n; i++) //給鄰接表中所有頭節點的指針域置初值G->adjlist[i].firstarc=NULL;for (i=0; i<n; i++) //檢查鄰接矩陣中每個元素for (j=n-1; j>=0; j--)if (Arr[i*n+j]!=0) //存在一條邊,將Arr看作n×n的二維數組,Arr[i*n+j]=Arr[i][j](n是有多少列){p=(ArcNode *)malloc(sizeof(ArcNode)); //創建一個節點*pp->adjvex=j;p->info=Arr[i*n+j];p->nextarc=G->adjlist[i].firstarc; //采用頭插法插入*p,和鏈表的操作一樣G->adjlist[i].firstarc=p;}G->e=count; } main.cpp #include <stdio.h> #include <malloc.h> #include "graph.h" //返回圖G中編號為v的頂點的出度 int OutDegree(ALGraph *G,int v) {ArcNode *p;int n=0;p=G->adjlist[v].firstarc;while (p!=NULL){n++;p=p->nextarc;}return n; } //輸出圖G中每個頂點的出度 void OutDs(ALGraph *G) {int i;for (i=0; i<G->n; i++)printf(" 頂點%d:%d\n",i,OutDegree(G,i)); } //輸出圖G中出度最大的一個頂點 void OutMaxDs(ALGraph *G) {int maxv=0,maxds=0,i,x;for (i=0; i<G->n; i++){x=OutDegree(G,i);if (x>maxds){maxds=x;maxv=i;}}printf("頂點%d,出度=%d\n",maxv,maxds); } //輸出圖G中出度為0的頂點數 void ZeroDs(ALGraph *G) {int i,x;for (i=0; i<G->n; i++){x=OutDegree(G,i);if (x==0)printf("%2d",i);}printf("\n"); } //返回圖G中是否存在邊<i,j> bool Arc(ALGraph *G, int i,int j) {ArcNode *p;bool found = false;p=G->adjlist[i].firstarc;while (p!=NULL){if(p->adjvex==j){found = true;break;}p=p->nextarc;}return found; } int main() {ALGraph *G;int A[7][7]={{0,1,1,1,0,0,0},{0,0,0,0,1,0,0},{0,0,0,0,1,1,0},{0,0,0,0,0,0,1},{0,0,0,0,0,0,0},{0,0,0,1,1,0,1},{0,1,0,0,0,0,0}};ArrayToList(A[0], 7, G);//建立鄰接矩陣結構printf("(1)各頂點出度:\n");OutDs(G);printf("(2)最大出度的頂點信息:");OutMaxDs(G);printf("(3)出度為0的頂點:");ZeroDs(G);printf("(4)邊<2,6>存在嗎?");if(Arc(G,2,6))printf("是\n");elseprintf("否\n");printf("\n");return 0; }
總結
以上是生活随笔為你收集整理的第十一周项目实践2 用邻接表存储的图来实现基本应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第十一周项目实践1 图基本算法库
- 下一篇: 第十一周项目实践3 DFS(深度优先搜索