2017-07-27 97 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; 
}