圖的十字連結串列儲存方式解析之二:刪邊操作

在圖的十字連結串列儲存方法中,增加邊非常簡單,與單鏈表插入結點操作類似,採取前插方法即可,但如果要刪除某條邊(tv,hv),則過程相對較為麻煩。

圖的十字連結串列儲存方式解析之二:刪邊操作

首先需要遍歷以tv為尾的邊連結串列,查詢該邊是否存在;其次,當邊(tv,hv)存在時,分析其在以tv為尾的邊連結串列中是頭結點還是非頭結點,同時還要分析其在以hv為頭的邊連結串列中是頭結點還是非頭結點;再次,刪除邊時,定義兩個臨時邊結點分別儲存前驅tlink和前驅hlink,將其分別指向該邊結點的tlink和hlink,然後刪除該邊結點。刪邊程式碼如下:

bool delEdge(int tv,int hv){ //當資料輸入非法時,直接退出 if(tv>=VerNum||tv<0||hv>=VerNum||hv<0||(tv==hv)||(vn[tv]。firstout==NULL)) return false; EdgeNode* ptail=vn[tv]。firstout; EdgeNode* phead=vn[hv]。firstin; EdgeNode* pttemp=ptail; EdgeNode* phtemp=phead;//當ptail在弧尾連結串列中是頭結點時 if(ptail->head==hv){ //在弧頭連結串列中也是頭結點時 if(phead==ptail){ vn[tv]。firstout=ptail->tlink; vn[hv]。firstin=ptail->hlink; delete ptail; return true; } //在弧頭連結串列中不是頭結點,遍歷弧頭連結串列,該結點一定是存在的 else{ while(phead!=ptail){ phtemp=phead; phead=phead->hlink; } //更新指標,刪除節點,返回 phtemp->hlink=ptail->hlink; vn[tv]。firstout=ptail->tlink; delete ptail; return true; } } //當ptail在弧尾連結串列中不是頭結點時,遍歷找到該點 else{ while(ptail!=NULL){ //此處if語句與下兩個賦值語句順序不能顛倒!!! if(ptail->head==hv) break; pttemp=ptail; ptail=ptail->tlink; } //如果該邊不存在,返回 if(ptail==NULL) return false; //該邊存在 if(ptail->head==hv){ //如果在弧頭連結串列中是頭結點,更新頭結點 if(phead==ptail){ vn[hv]。firstin=ptail->hlink; } //在弧頭連結串列中不是頭結點,遍歷找到該結點的前驅結點,將hlink指向該結點後繼 else{ while(phead!=ptail){ phtemp=phead; phead=phead->hlink; } phtemp->hlink=ptail->hlink; } //在弧尾連結串列中將該結點前驅tlink指向該結點後繼 pttemp->tlink=ptail->tlink; delete ptail; return true; } }}