【系列文章】資料結構與演算法——圖

來源:互聯網
上載者:User

標籤:

---恢複內容開始---

接觸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);

 

具體調用執行個體不再給出。。嘿嘿。

 

本文章為系列文章,下一篇:遍曆圖

【系列文章】資料結構與演算法——圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.