设为首页 加入收藏

TOP

一步一步写算法(之图添加和删除) (二)
2014-11-23 23:40:04 来源: 作者: 【 】 浏览:42
Tags:步一步 算法 添加 删除
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

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C代码性能优化 下一篇一步一步写算法(之字符串查找 中..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: