为什么我在空指针错误(链表)中获取成员访问权限



下面是错误消息和我的链表代码。 你能向我解释为什么我会收到这个错误吗?

"第 80 行:字符 21:运行时错误:类型为'Node'的空指针内的成员访问(解决方案.cpp( 摘要:未定义的行为清理器:未定义的行为 prog_joined.cpp:85:21">

struct Node{
int val;
Node* prev;
Node* next;
Node(): val(-1), prev(nullptr), next(nullptr){}
Node(int x): val(x), prev(nullptr), next(nullptr){}
};
class MyLinkedList {
private:
Node* head;
Node* tail;
size_t size;
public:
MyLinkedList() {
head = new Node();
tail = new Node();
head->next = tail;
tail->prev = head;
size = 0;
}

int get(int index) {
if(index < 0 || index > size) return -1;
Node* temp = head->next;
while(index--) temp = temp->next;
return temp->val;
}

void addAtHead(int val) {
Node* newNode = new Node(val);
Node* next = head->next;
next->prev = newNode;
newNode->next = next;
head->next = newNode;
newNode->prev = head;
size++;
}
void addAtTail(int val) {
Node* last_node = new Node(val);
Node* temp = tail->prev;

temp->next = last_node;
last_node->prev = temp;
last_node->next = tail;
tail->prev = last_node;
size++;
}

void addAtIndex(int index, int val) {
if(index < 0 || index > size+1) return;
if(index == 0) addAtHead(val);
else if(index == size+1) addAtTail(val);
else{
Node* index_node = new Node(val);
Node* temp = head;
while(index--) temp = temp->next;
index_node->next = temp->next;
temp->next->prev = index_node;
temp->next = index_node;
index_node->prev = temp;
size++;
}
}

void deleteAtIndex(int index) {
if(index > size) return;
Node* temp = head;
while(index--) temp = temp->next;
temp->next = temp->next->next;
temp->next->prev = temp;
size--;
}
};

非常感谢

没关系,事实证明这个小家伙一直是问题所在:

void addAtHead(int val) {
Node* newNode = new Node(val);
Node* next = head->next;
next->prev = newNode;
newNode->next = next;
head->next = newNode;
newNode->prev = head;
size++;
}

你初始化了尾巴到下一个头,但是在你的addToHead函数中,你从来没有移动尾巴,而是添加到head->next,所以在添加一次之后,你的新节点将是尾部,经过两次迭代后,你的新节点将超过你的尾巴,在你的尾部之前。然后你调用你的addToTail函数,所以当你这样做时,tail->prev = last_node,记住之前是什么tail-prev:这是正确的头,所以你不会再有一个头节点,因此链被破坏了,下次你尝试调用addToHead时,你找不到你的头,你没有指向它的指针, 所以它崩溃了。

最新更新