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