在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ 圖創(chuàng)建
hash表
單詞統(tǒng)計
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹的保存和加載
圖添加和刪除
排序二叉樹線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹深度遍歷
線性隊列
循環(huán)和遞歸
快速排序
尋找丟失的數(shù)
A*算法
克魯斯卡爾算法 下
排序二叉樹
大數(shù)計算
二叉樹廣度遍歷
prim算法 下
洗牌算法
圖結(jié)構(gòu)
最大公約數(shù)、最小公倍數(shù)
圖創(chuàng)建
雙向鏈表
字符串查找 上篇
尋路
通用算法的編寫
哈夫曼樹 下
線性堆棧
八皇后
排序二叉樹刪除-1
挑選最大的n個數(shù)
字符串查找 中篇
哈夫曼樹 上
合并排序
回數(shù)
選擇排序
哈希二叉樹
通用數(shù)據(jù)結(jié)構(gòu)
“數(shù)星星”
單向鏈表
排序二叉樹插入
圖的保存
排序二叉樹刪除-2
排序二叉樹刪除-3
n!中末尾零的個數(shù)統(tǒng)計

圖創(chuàng)建

前面我們討論過圖的基本結(jié)構(gòu)是什么樣的。它可以是矩陣類型的、數(shù)組類型的,當然也可以使指針類型的。當然,就我個人而言,比較習慣使用的結(jié)構(gòu)還是鏈表指針類型的。本質(zhì)上,一幅圖就是由很多節(jié)點構(gòu)成的,每一個節(jié)點上面有很多的分支,僅此而已。為此,我們又對原來的結(jié)構(gòu)做了小的改變:

typedef struct _LINE
{
    int end;
    int weight;
    struct _LINE* next;
}LINE;

typedef struct _VECTEX
{
    int start;
    int number;
    LINE* neighbor;
    struct _VECTEX* next;
}VECTEX;

typedef struct _GRAPH
{
    int count;
    VECTEX* head;
}GRAPH;

為了創(chuàng)建圖,首先我們需要創(chuàng)建節(jié)點和創(chuàng)建邊。不妨從創(chuàng)建節(jié)點開始,

VECTEX* create_new_vectex(int start)
{
    VECTEX* pVextex = (VECTEX*)malloc(sizeof(VECTEX));
    assert(NULL != pVextex);

    pVextex->start = start;
    pVextex->number = 0;
    pVextex->neighbor = NULL;
    pVextex->next = NULL;
    return pVextex;
}

接著應該創(chuàng)建邊了,

LINE* create_new_line(int end, int weight)
{
    LINE* pLine = (LINE*)malloc(sizeof(LINE));
    assert(NULL != pLine);

    pLine->end = end;
    pLine->weight = weight;
    pLine->next = NULL;
    return pLine;
}

有了上面的內(nèi)容,那么創(chuàng)建一個帶有邊的頂點就變得很簡單了,

VECTEX* create_new_vectex_for_graph(int start, int end, int weight)
{
    VECTEX* pVectex = create_new_vectex(start);
    assert(NULL != pVectex);

    pVectex->neighbor = create_new_line(end, weight);
    assert(NULL != pVectex->neighbor);

    return pVectex;
}

那么,怎么它怎么和graph相關(guān)呢?其實也不難。

GRAPH* create_new_graph(int start, int end, int weight)
{
    GRAPH* pGraph = (GRAPH*)malloc(sizeof(GRAPH));
    assert(NULL != pGraph);

    pGraph->count = 1;
    pGraph->head = create_new_vectex_for_graph(start, end, weight);
    assert(NULL != pGraph->head);

    return pGraph;
}

有了圖,有了邊,那么節(jié)點和邊的查找也不難了。

VECTEX* find_vectex_in_graph(VECTEX* pVectex, int start)
{
    if(NULL == pVectex)
        return NULL;

    while(pVectex){
        if(start == pVectex->start)
            return pVectex;
        pVectex = pVectex->next;
    }

    return NULL;
}

LINE* find_line_in_graph(LINE* pLine, int end)
{
    if(NULL == pLine)
        return NULL;

    while(pLine){
        if(end == pLine->end)
            return pLine;

        pLine = pLine->next;
    }

    return NULL;
}

總結(jié):

(1)圖就是多個鏈表的聚合

(2)想學好圖,最好把前面的鏈表和指針搞清楚、弄扎實

(3)盡量寫小函數(shù),小函數(shù)構(gòu)建大函數(shù),方便閱讀和調(diào)試

上一篇:單向鏈表下一篇:合并排序