2013-10-25 286 views
2

嗨我试图删除链接列表中的节点。我首先试验如何删除头部和尾部节点。头部删除似乎可行,但删除后的尾部不会。当我运行代码时,尾部曾经的位置被垃圾值替换。任何人都可以找出原因吗?非常感谢!未来要删除删除链接列表中的节点

回答

2

考虑node_1点node_2(只是一个2节点的情况下) 只要看看这段代码

else if (pMyPointer == m_pTail) 
     m_pTail = m_pTail->m_pPrev; 

node_1点node_2。它仍然指向那里。一旦你删除了node_2,node_1仍然会指向node_2(或者一旦node_2被删除,就会造成垃圾)&,所以你必须确保node_1指向NULL。即最后一个应该指向null。

else if (pMyPointer == m_pTail) 
    m_pTail->m_pPrev->next=NULL; 
    m_pTail = m_pTail->m_pPrev; 
+0

非常感谢你! – user1816546

0

保持一个节点你的尾巴和头指针是一样的吗?你不检查它。因此你可能会删除你认为是Head的指针,这也是一个尾巴。另外,如果它的下一个头部或尾部是什么?

void CList :: Remove() { 

    int data = NULL; 

    std::cout<<"Enter value you wish to remove "; 
    std:: cin>> data; 

    cNode *pMyPointer = m_pHead; 

    while (pMyPointer != NULL) 
    { 
     if (pMyPointer->m_nValue == data) { 
      std::cout << "Element found"; 
      goto del; 
     } 

     else { 
      pMyPointer = pMyPointer->m_pNext; 
     } 
    } 

    del: 

    //taking care of the neighbors 
    if (pMyPointer->m_pPrev) 
     pMyPointer->m_pPrev->m_pNext = pMyPointer->m_pNext; 
    if (pMyPointer->m_pNext) 
     pMyPointer->m_pNext->m_pPrev = pMyPointer->m_pPrev; 
    // removing the head 
    if (pMyPointer == m_pHead) 
     m_pHead= m_pHead->m_pNext; 
    //removing the tail 
    if (pMyPointer == m_pTail) 
     m_pTail = m_pTail->m_pPrev; 

    delete pMyPointer; 
} 
+1

你能解释一点好吗? – user1816546

+0

他的意思是,如果你想删除节点3,你必须遍历链表到节点2,然后去节点3,删除他并继续到节点4.现在你必须将节点2的地址保存到前一个地址节点4(如果列表是双链接的)和节点4到节点2的下一个地址。 – andreashager

+0

好的,谢谢,我会看看如果我可以尝试合并 – user1816546

0

如果什么节点

void CList :: Remove() { 

    int data = NULL; 

    std::cout<<"Enter value you wish to remove "; 
    std:: cin>> data; 

    cNode *pMyPointer = m_pHead; 

    while (pMyPointer != NULL) 
    { 
     if (pMyPointer->m_nValue == data) { 
      std::cout << "Element found"; 
      goto del; 
     } 

     else { 
      pMyPointer = pMyPointer->m_pNext; 
     } 
    } 

    del: 

    //removing the head 
    if (pMyPointer == m_pHead) 
     m_pHead= m_pHead->m_pNext; 
    //removing the tail 
    else if (pMyPointer == m_pTail) 
     m_pTail = m_pTail->m_pPrev; 

    delete pMyPointer; 
} 
1

这种说法

while (pMyPointer != NULL) 

你的指针可能指向NULL时退出循环,因此它会跳过尾指针。

而是尝试

while (pMyPointer->m_pNext != NULL) 

您还需要进行第二次最后一个节点指向NULL。

else if (pMyPointer == m_pTail) { 
    m_pTail = m_pTail->m_pPrev; 
    m_pTail->m_pNext = NULL; 
} 
delete pMyPointer; 

另外,代替goto del,只是使用break;

+0

新条件不起作用,程序仍然崩溃并打印垃圾值曾经是尾巴。我已经安排了goto del,谢谢你的提示! – user1816546

+0

@ user1816546我编辑了我的答案 –

+0

非常感谢您的帮助,但是我在您之前看到了MAG用户的答案。如果可以的话,我会回答两个正确的答案! – user1816546