嗨我试图删除链接列表中的节点。我首先试验如何删除头部和尾部节点。头部删除似乎可行,但删除后的尾部不会。当我运行代码时,尾部曾经的位置被垃圾值替换。任何人都可以找出原因吗?非常感谢!未来要删除删除链接列表中的节点
回答
考虑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;
保持一个节点你的尾巴和头指针是一样的吗?你不检查它。因此你可能会删除你认为是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;
}
你能解释一点好吗? – user1816546
他的意思是,如果你想删除节点3,你必须遍历链表到节点2,然后去节点3,删除他并继续到节点4.现在你必须将节点2的地址保存到前一个地址节点4(如果列表是双链接的)和节点4到节点2的下一个地址。 – andreashager
好的,谢谢,我会看看如果我可以尝试合并 – user1816546
如果什么节点
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;
}
这种说法
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;
新条件不起作用,程序仍然崩溃并打印垃圾值曾经是尾巴。我已经安排了goto del,谢谢你的提示! – user1816546
@ user1816546我编辑了我的答案 –
非常感谢您的帮助,但是我在您之前看到了MAG用户的答案。如果可以的话,我会回答两个正确的答案! – user1816546
- 1. 删除链接列表中的节点
- 2. 删除链接列表中的节点
- 3. 删除链接列表中的节点
- 4. 从链接列表中删除节点
- 5. 从链接列表中删除节点
- 6. 从链接列表中删除节点
- 7. 从链接列表中删除节点
- 8. 从链接列表中删除节点
- 9. 链接列表删除节点后根
- 10. 链接列表删除节点
- 11. 链接列表删除正在删除错误的节点
- 12. 在C++中删除链接列表中的节点
- 13. 从Java中的链接列表中删除奇数int节点
- 14. 如何删除java中链接列表中的唯一节点?
- 15. 从具有特定值的链接列表中删除节点
- 16. 删除位于链接列表中间的节点
- 17. C++删除单个链接列表中的另一个节点
- 18. 如何删除链接列表中的第一个节点?
- 19. 需要删除链接列表中的重复节点
- 20. 删除链接列表中的某个节点C编程
- 21. 无法删除链接列表中的第一个节点
- 22. C删除链接列表中的节点
- 23. 删除链接列表中的节点java
- 24. 删除单个链接列表中间的节点
- 25. 使用java删除链接列表中的节点
- 26. 如何删除链接列表中的特定节点
- 27. 删除链接列表中的节点不起作用?
- 28. 如何删除链接列表中的节点?
- 29. 关于删除链接列表中的节点
- 30. 删除链接列表中给定位置的节点
非常感谢你! – user1816546