[英]Pointer losing reference to previous node C++
我正在编写一个程序来学习双向链表。 我似乎无法调试的问题是,调试器给了我一个写访问冲突,并指出prevNode-> next或nextNode-> prev指向空。 一旦您尝试从第n个位置删除节点,就会发生这种情况。 我删除了这篇文章的部分代码,以使其更短且更易于阅读,因此某些变量似乎未使用。
调试器通常停止的部分是删除节点之前的最后一行:
nextNode = nodePtr->next;
prevNode = nodePtr->prev;
nextNode->prev = prevNode;
prevNode->next = nextNode;
delete(nodePtr);
我知道要删除列表开头和结尾的节点将需要不同的代码(if语句),以确保prevNode-> next和nextNode-> prev未设置为不存在的节点。 问题是,即使我试图删除不在列表开头或结尾的节点,也会给我这些错误。
任何帮助或朝着正确方向的推动将不胜感激!
#include <iostream>
using namespace std;
int main() {
struct ListNode {
int value;
ListNode *next;
ListNode *prev;
};
ListNode *head = nullptr;
ListNode *newNode = nullptr;
ListNode *nodePtr = nullptr;
ListNode *prevPtr = nullptr;
ListNode *nextNode = nullptr;
ListNode *prevNode = nullptr;
char ch = 'q';
int val;
int pos;
do
{
cout << "h-delete from position" << endl;
cout << "i-insert" << endl;
cout << "p-print" << endl;
cout << "q-quit" << endl;
cin >> ch;
switch (ch) {
case 'i':
cout << "inserting ... \n";
cout << "Enter an integer: ";
cin >> val;
newNode = new ListNode;
newNode->value = val;
newNode->next = nullptr;
if (head == nullptr) {
head = newNode;
}
else {
nodePtr = head;
prevPtr = nullptr;
while (nodePtr != nullptr && nodePtr->value < newNode->value) {
prevPtr = nodePtr;
nodePtr = nodePtr->next;
}
if (prevPtr == nullptr) {
head = newNode;
newNode->next = nodePtr;
}
else {
prevPtr->next = newNode;
newNode->next = nodePtr;
}
}
break;
case 'p':
cout << "printing ... \n";
nodePtr = head;
while (nodePtr != nullptr) {
cout << "elem: " << nodePtr->value << endl;
nodePtr = nodePtr->next;
}
break;
case 'h':
//FIX
int findVal;
cin >> findVal;
nodePtr = head;
while (nodePtr->value != findVal) {
nodePtr = nodePtr->next;
}
nextNode = nodePtr->next;
prevNode = nodePtr->prev;
nextNode->prev = prevNode;
prevNode->next = nextNode;
delete(nodePtr);
break;
case 'q':
cout << "quitting ... \n";
nodePtr = head;
while (nodePtr != nullptr) {
nextNode = nodePtr->next;
cout << "deleting ... " << nodePtr->value << endl;
delete nodePtr;
nodePtr = nextNode;
}
break;
default:
system("CLS");
cout << "Invalid character -- Please try again!" << endl;
break;
}
} while (ch != 'q');
system("pause");
return 0;
}
该行将失败:
prevNode = nodePtr->prev;
.....
prevNode->next = nextNode;
因为插入节点时不会给prev
一个值。 因此prevNode
将始终为nullptr
在调试器中逐行浏览将帮助您找到这些类型的错误。
在h
情况下,如果输入的值不存在,则可以尝试在空地址处使用该对象。
另外,如果删除第一个节点(头),则不会更新它,因此此后的任何其他操作都会因使用被破坏的对象而失败,并且这是未定义的行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.