標籤:
---恢複內容開始---
接觸C語言是很早以前的事了,大概是在初中二年級。後來發現只學語言,不學演算法根本沒用,於是乎萌發了學習資料結構和演算法的想法,但一直沒有什麼實際進展。直到今天,才決定好好研究一番(ps:今年大一,甚是慚愧),順便把學習過程記錄在這一系列文章之中。好了,廢話不多說,開始我這一系列的文章。文中可能有錯誤,如果你發現了,我懇請你幫我指出。謝謝。
圖——圖能很方便的描述一些實際問題,常用於尋找最優解類型的問題。其他相關概念,百度百科說的很清楚了。
學習圖大概有以下幾個過程。
一.建立圖:(鄰接表和領接矩陣)
二.遍曆圖:(深度遍曆和廣度遍曆)
三.使用圖:(普裡姆演算法,迪傑斯特拉演算法等)
詳解:
一:建立圖:
常見的圖的表示方法有兩種,一是鄰接矩陣方法,而是鄰接表方法,各有優勢。鄰接矩陣法適合於節點較少的,稠密的圖,而鄰接表法則適合於相反情況。
但我個人在使用中更加偏向於使用鄰接表法(可能是我更排斥C語言中靜態數組的原因吧,所以我所有執行個體都會是鄰接表法)
好,確定了採用哪種方法表示圖後,還要確定具體的一些表示發放。例中節點的表示方法
具體思維過程如下:(以鄰接表發為例)
首先建立一個結構體類型用來表示圖
typedef struct _gragh{ Vertex * vertexs; int vertexCount;}Gragh;
其中的Vertex代表頂點類型
typedef struct _vertex{ ElemType data; Node *firstNode;}Vertex;
根據鄰接表的定義方法,每一個頂點都有一個維護一個鏈表,用來儲存他的鄰接點
所以鏈表中節點類型為Node
typedef struct _node{ ElemType data; int weight; struct _node *next;}Node;
每個節點包含節點資料data,該節點對應邊的權值,以及下一個鄰接點的指標。
好了,基本的類型定義完了,我們就實際的建立一個圖。建立圖我用函數CreateGragh
void CreateGragh(Gragh **gragh){ int i, j,k; int count; printf("輸入頂點個數:\n"); scanf("%d", &count); *gragh = (Gragh *)malloc(sizeof(Gragh)); (*gragh)->vertexCount = count; (*gragh)->vertexs = (Vertex*)malloc(sizeof(Vertex)*count); if (*gragh == NULL) ErrorMsg(); for (i = 0; i < count; i++) { Vertex *newVertex = (Vertex*)malloc(sizeof(Vertex)); newVertex->firstNode = NULL; printf("輸入此頂點資料和鄰接點個數:\n"); scanf("%d%d", &newVertex->data, &newVertex->count); for (j = 0; j < newVertex->count; j++) { Node *newNode = (Node*)malloc(sizeof(Node)); printf("輸入鄰接點資料和該鄰接點對應邊權值:\n"); scanf("%d%d", &newNode->data, &newNode->weight); newNode->next = NULL; Node *temp = newVertex->firstNode; if (temp == NULL) newVertex->firstNode = newNode; else { while (temp->next != NULL) { temp = temp->next; } temp->next = newNode; } } (*gragh)->vertexs[i] = *newVertex; }}
在建立圖的時候,我們只需要傳入一個Gragh類型的指標變數即可。
調用如下:(在主函數中如下調用即可)
Gragh *gragh;CreateGragh(&gragh);
具體調用執行個體不再給出。。嘿嘿。
本文章為系列文章,下一篇:遍曆圖
【系列文章】資料結構與演算法——圖