一步一步写算法(之图添加和删除) (二)

2014-11-23 23:40:04 · 作者: · 浏览: 58
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;

}

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)判断图中是否有节点存在,如果没有,返回出错

2)判断图中节点start是否存在,如果不存在,返回出错

3)判断节点start中是否end边存在,如果不存在,返回出错

4)删除对应的边

5)判断该节点的边计数number是否为0,如果为0,继续删除节点

6)删除过程中注意边和顶点的个数处理

view plaincopy to clipboardprint 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;

}

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