2017-07-27 91 views
1

我試圖在我的類中編寫一個函數,該函數接受一個節點並在雙向鏈表中直接刪除該節點。我有單獨的功能,刪除第一個或最後一個節點,所以這只是在中間節點的情況下。我認爲它的邏輯是合理的,我的代碼編譯了,但是當我嘗試測試它時,程序永遠不會停止運行,所以我認爲它在while循環中停滯不前。我也不確定我是否正確地調用了該函數。在名爲DLL的雙向鏈表中,由1,2,34填充,我試圖通過將DLL.removeAfter(2)放在主體中來刪除3。我看到這在邏輯上有缺陷,因爲列表中可能有多個2,但我不知道什麼是正確的。在雙向鏈表中的給定節點之後刪除節點

void DoublyLinkedList::removeAfter(const DListNode &p) 
{ 
    DListNode *node = header.next; 
    while(node != &p) 
    { 
     node->next; //iterate to p; 
    } 
    node->next; //Get to the node after p that is to be deleted 
    node->prev->next = node->next; 
    node->next->prev = node->prev; 
    delete node; 
} 

回答

0

我想你要替換的node->nextnode = node->next這兩種情況下,否則你永遠不會改變的node值。

+0

謝謝,這是有道理的。我實施了這一改變。我如何調用這個函數? – claire

+0

你可以編輯你的帖子來顯示你如何實例化你的'DoublyLinkedList'類並調用函數嗎? – Matt

+0

感謝您的幫助!現在一切正常。 – claire

0
void DoublyLinkedList::removeAfter(const DListNode &p) 
{ 
    DListNode *node = header.next; 

    while(node != &p) { 
     node = node->next; //iterate to p; 
    } 

    DListNode* del_note = node->next; //Get to the node after p that is to be deleted 
    node->next = del_note->next; 
    del_note->next->prev = node; 

    delete del_note; 
} 

當然,這隻發現while休息時發現第一個元素。

0
void DoublyLinkedList::removeAfter(const DListNode &p) 
{ 
DListNode *node = &header,*NextNode=null; 
do { 
node = node->next;  
} 
while(node != &p); 
if(node->next != null) `{ 
NextNode = node->next; //Next Node need to be removed but if next node have more modes attached than it should again assigned to the node then it should get removed.... 
if(NextNode->next != null) 
node->next = NextNode->next; 
else 
`node->next = null; 
}