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

鍍金池/ 教程/ 數(shù)據(jù)分析&挖掘/ 圖添加和刪除
hash表
單詞統(tǒng)計
鏈表排序
查找
可變參數(shù)
爬樓梯
內(nèi)存
prim算法 中
線性結(jié)構(gòu)的處理
數(shù)據(jù)選擇
prim算法 上
循環(huán)單向鏈表
基數(shù)排序
堆排序
鏈表重合
排序二叉樹的保存和加載
圖添加和刪除
排序二叉樹線索化
非遞歸排序
字符串查找 下篇
鏈表逆轉(zhuǎn)
函數(shù)堆棧顯示
遞歸和堆棧
二叉樹深度遍歷
線性隊(duì)列
循環(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)計

圖添加和刪除

前面我們談到的圖的數(shù)據(jù)結(jié)構(gòu)、圖的創(chuàng)建,今天我們就來說一說如何在圖中添加和刪除邊。邊的添加和刪除并不復(fù)雜,但是關(guān)鍵有一點(diǎn)需要記住,那就是一定要在小函數(shù)的基礎(chǔ)之上構(gòu)建大函數(shù),否則很容易出現(xiàn)錯誤。

一、邊的創(chuàng)建

邊的創(chuàng)建一般來說可以分為下面以下幾個步驟:

1)判斷當(dāng)前圖中是否有節(jié)點(diǎn),如果沒有,那么在pGraph->head處添加一條邊即可

2)如果當(dāng)前圖中有節(jié)點(diǎn),那么判斷節(jié)點(diǎn)中有沒有以start點(diǎn)開頭的,如果沒有創(chuàng)建一個頂點(diǎn)和邊,并插入圖的head處

3)在當(dāng)前有節(jié)點(diǎn)start中,判斷是否end的邊已經(jīng)存在。如果end邊存在,返回出錯;否則在pVectex->neighbour處添加一條邊

4)添加的過程中注意點(diǎn)的個數(shù)和邊的個數(shù)處理

STATUS insert_vectex_into_graph(GRAPH* pGraph, int start, int end, int weight)
{
    VECTEX* pVectex;
    LINE* pLine;

    if(NULL == pGraph)
        return FALSE;

    if(NULL == pGraph->head){
        pGraph->head = create_new_vectex_for_graph(start, end, weight);
        pGraph->head->number ++;
        pGraph->count ++;
        return TRUE;
    }

    pVectex = find_vectex_in_graph(pGraph->head, start);
    if(NULL == pVectex){
        pVectex = create_new_vectex_for_graph(start, end, weight);
        pVectex->next = pGraph->head;
        pGraph->head = pVectex;
        pGraph->head->number ++;
        pGraph->count ++;
        return TRUE;
    }

    pLine = find_line_in_graph(pVectex->neighbor, end);
    if(NULL != pLine)
        return FALSE;

    pLine = create_new_line(end, weight);
    pLine->next = pVectex->neighbor;
    pVectex->neighbor = pLine;
    pVectex->number ++;
    return TRUE;
}

二、邊的刪除

在進(jìn)行邊的刪除之前,我們需要對鏈表子節(jié)點(diǎn)進(jìn)行處理,構(gòu)建delete小函數(shù),這樣可以在邊刪除函數(shù)中使用。

STATUS delete_old_vectex(VECTEX** ppVectex, int start)
{
    VECTEX* pVectex;
    VECTEX* prev;

    if(NULL == ppVectex || NULL == *ppVectex)
        return FALSE;

    pVectex = find_vectex_in_graph(*ppVectex, start);
    if(NULL == pVectex)
        return FALSE;

    if(pVectex == *ppVectex){
        *ppVectex = pVectex->next;
        free(pVectex);
        return TRUE;
    }

    prev = *ppVectex;
    while(pVectex != prev->next)
        prev = prev->next;

    prev->next = pVectex->next;
    free(pVectex);
    return TRUE;
}

STATUS delete_old_line(LINE** ppLine, int end)
{
    LINE* pLine;
    LINE* prev;

    if(NULL == ppLine || NULL == *ppLine)
        return FALSE;

    pLine = find_line_in_graph(*ppLine, end);
    if(NULL == pLine)
        return FALSE;

    if(pLine == *ppLine){
        *ppLine = pLine->next;
        free(pLine);
        return TRUE;
    }

    prev = *ppLine;
    while(pLine != prev->next)
        prev = prev->next;

    prev->next = pLine->next;
    free(pLine);
    return TRUE;
}

一般來說,邊的刪除和邊的添加是可逆的,過程如下所示:

1)判斷圖中是否有節(jié)點(diǎn)存在,如果沒有,返回出錯

2)判斷圖中節(jié)點(diǎn)start是否存在,如果不存在,返回出錯

3)判斷節(jié)點(diǎn)start中是否end邊存在,如果不存在,返回出錯

4)刪除對應(yīng)的邊

5)判斷該節(jié)點(diǎn)的邊計數(shù)number是否為0,如果為0,繼續(xù)刪除節(jié)點(diǎn)

6)刪除過程中注意邊和頂點(diǎn)的個數(shù)處理

STATUS delete_vectex_from_graph(GRAPH* pGraph, int start, int end, int weight)
{
    VECTEX* pVectex;
    LINE* pLine;
    STATUS result;

    if(NULL == pGraph || NULL == pGraph->head)
        return FALSE;

    pVectex = find_vectex_in_graph(pGraph->head, start);
    if(NULL == pVectex)
        return FALSE;

    pLine = find_line_in_graph(pVectex->neighbor, end);
    if(NULL != pLine)
        return FALSE;

    result = delete_old_line(&pVectex->neighbor, end);
    assert(TRUE == result);
    pVectex->number --;

    if(0 == pVectex->number)
        result = delete_old_vectex(&pGraph->head, start);

    assert(TRUE == result);
    pGraph->count --;
    return TRUE;
}

注意事項(xiàng):

(1)注意寫小函數(shù),再復(fù)雜的功能都是有無數(shù)的小功能構(gòu)建的,函數(shù)最好不要超過50行

(2)老規(guī)矩,代碼務(wù)必要測試

上一篇:數(shù)據(jù)選擇下一篇:內(nèi)存