圖的經常使用表示方法就是矩陣和鄰接表。數據結構
矩陣一般使用與規整的,且數據量較小的圖,這種圖直觀上方便的表示出了圖之間節點的相互關係。ide
typedef struct Graph_Matrix{ char vers[NUM]; //存儲數據表示 int arc[NUM][NUM];//二維矩陣圖,用來表示節點相連狀況 int numVer,numEdge;//頂點數,和邊數 }Graph_Matrix;
爲了防止圖中有不連通的子圖,所以每一個節點順序的遍歷一次,每次採用深度優先遍歷其聯通子圖,避免了遺漏節點。spa
有點相似書中遍歷玩父節點,直接遍歷他的左邊孩子,而後再回來....code
int DFS(Graph_Matrix *g,int i){ int j; visited[i] = 1; printf("%c ",g->vers[i]); for(j=0;j<g->numVer;j++){ if(g->arc[i][j] == 1 && !visited[j]) DFS(g,j); } } void DFSTraverse(Graph_Matrix *g){ int i; for(i=0;i<g->numVer;i++) visited[i] = 0; for(i=0;i<g->numVer;i++){ if(!visited[i]) DFS(g,i); } }
廣度優先遍歷,主要依賴於一個隊列,每次遍歷一個父節點,尋找他的子節點一次放入隊列中,遍歷完,讀取隊列中的隊頭,在此讀取其子節點,有點相似樹中遍歷父節點後,在遍歷他的孩子節點。blog
void BFSTraverse(Graph_Matrix *g){ int i,j; Queue *q = (Queue *)malloc(sizeof(Queue)); for(i=0;i<g->numVer;i++) visited[i] = 0; initQueue(q,0); for(i=0;i<g->numVer;i++){ if(!visited[i]){ visited[i] = 1; printf("%c ",g->vers[i]); inQueue(q,i); while(getLength(q)){ int *tar = (int *)malloc(sizeof(int)); outQueue(q,tar); for(j=0;j<g->numVer;j++){ if(g->arc[*tar][j] == 1 && !visited[j]){ visited[j] = 1; printf("%c ",g->vers[j]); inQueue(q,j); } } } } } }
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define NUM 5 4 #define MAXSIZE NUM 5 typedef struct Graph_Matrix{ 6 char vers[NUM]; 7 int arc[NUM][NUM]; 8 int numVer,numEdge; 9 }Graph_Matrix; 10 11 typedef struct Queue{ 12 int data[NUM]; 13 int front; 14 int rear; 15 }Queue; 16 17 void initQueue(Queue *q,int n); 18 void showQueue(Queue *q); 19 int getLength(Queue *q); 20 int inQueue(Queue *q,int num); 21 int outQueue(Queue *q,int *tar); 22 23 void createGraph(Graph_Matrix *g); 24 void showGraph(Graph_Matrix *g); 25 int visited[NUM]; 26 int DFS(Graph_Matrix *g,int i); 27 void DFSTraverse(Graph_Matrix *g); 28 void BFSTraverse(Graph_Matrix *g); 29 30 int main() 31 { 32 Graph_Matrix * g1 = (Graph_Matrix *)malloc(sizeof(Graph_Matrix)); 33 createGraph(g1); 34 showGraph(g1); 35 printf("\n"); 36 DFSTraverse(g1); 37 printf("\n"); 38 BFSTraverse(g1); 39 return 0; 40 } 41 42 void createGraph(Graph_Matrix *g){ 43 int i; 44 int j; 45 g->numEdge = 0; 46 for(i=0;i<NUM;i++){ 47 g->vers[i] = 65+i; 48 } 49 for(i=0;i<NUM;i++){ 50 for(j=0;j<NUM;j++){ 51 if(i != j){ 52 g->arc[i][j] = 1; 53 g->numEdge++; 54 } 55 else 56 g->arc[i][j] = 0; 57 } 58 } 59 g->arc[2][3] = g->arc[3][2] = 0; 60 g->arc[1][2] = g->arc[2][1] = 0; 61 g->numEdge -= 4; 62 g->numEdge = g->numEdge/2; 63 g->numVer = 5; 64 } 65 void showGraph(Graph_Matrix *g){ 66 int i,j; 67 for(i=0;i<g->numVer;i++){ 68 printf("%c ",g->vers[i]); 69 } 70 printf("\n"); 71 72 for(i=0;i<g->numVer;i++){ 73 for(j=0;j<g->numVer;j++){ 74 printf("%d ",g->arc[i][j]); 75 } 76 printf("\n"); 77 } 78 printf("vertexes:%d edges:%d",g->numVer,g->numEdge); 79 } 80 81 int DFS(Graph_Matrix *g,int i){ 82 int j; 83 visited[i] = 1; 84 printf("%c ",g->vers[i]); 85 for(j=0;j<g->numVer;j++){ 86 if(g->arc[i][j] == 1 && !visited[j]) 87 DFS(g,j); 88 } 89 } 90 void DFSTraverse(Graph_Matrix *g){ 91 int i; 92 for(i=0;i<g->numVer;i++) 93 visited[i] = 0; 94 for(i=0;i<g->numVer;i++){ 95 if(!visited[i]) //若是是連通圖,只會執行一次 96 DFS(g,i); 97 } 98 } 99 100 void BFSTraverse(Graph_Matrix *g){ 101 int i,j; 102 Queue *q = (Queue *)malloc(sizeof(Queue)); 103 for(i=0;i<g->numVer;i++) 104 visited[i] = 0; 105 initQueue(q,0); 106 for(i=0;i<g->numVer;i++){ 107 if(!visited[i]){ 108 visited[i] = 1; 109 printf("%c ",g->vers[i]); 110 inQueue(q,i); 111 while(getLength(q)){ 112 int *tar = (int *)malloc(sizeof(int)); 113 outQueue(q,tar); 114 for(j=0;j<g->numVer;j++){ 115 if(g->arc[*tar][j] == 1 && !visited[j]){ 116 visited[j] = 1; 117 printf("%c ",g->vers[j]); 118 inQueue(q,j); 119 } 120 } 121 } 122 } 123 } 124 } 125 126 void initQueue(Queue *q,int n){ 127 int i; 128 q->front=0; 129 q->rear =0; 130 for(i=0;i<n;i++){ 131 q->data[q->rear]=2*i+1; 132 q->rear++; 133 } 134 } 135 void showQueue(Queue *q){ 136 int i; 137 int len=getLength(q); 138 printf("front-"); 139 for(i=0;i<len;i++){ 140 if(q->front+i<MAXSIZE) 141 printf("%d-",q->data[q->front+i]); 142 else 143 printf("%d-",q->data[q->front+i-MAXSIZE]); 144 } 145 printf("rear\n"); 146 } 147 int getLength(Queue *q){ 148 return (q->rear-q->front+MAXSIZE)%MAXSIZE; 149 } 150 int inQueue(Queue *q,int num){ 151 if((q->rear+1)%MAXSIZE == q->front) 152 return 0; 153 q->data[q->rear] = num; 154 q->rear = (q->rear+1)%MAXSIZE; 155 return 1; 156 } 157 int outQueue(Queue *q,int *tar){ 158 if(q->front == q->rear) 159 return 0; 160 *tar = q->data[q->front]; 161 q->front = (q->front+1)%MAXSIZE; 162 return 1; 163 }