如标题中所示,我的代码给出了上述警告并混搭了内存引用。我的任务是在C ++中使用嵌套类。这段代码主要是我的代码,用于以前的C应用程序中的链表,但针对C ++进行了重新制作。我已经在互联网上搜索了有关NULL异常的信息,但无法弄清。我会发布代码,希望有人能给我一些提示。在Internet上的各种链接和技巧中,它表示我指向的指针是指向NULLptr的,并且不能访问NULL地址。试图以各种形式对其进行审查,但它不起作用。
标题
#ifndef LIST_H
#define LIST_H
#include <iostream>
#include <math.h>
using namespace std;
class List
{
private:
class Node {
public:
int data;
Node* next;
Node() {
this->data = NULL;
this->next = NULL;
}
};
Node* head;
public:
List();
void insertList(int data);
void deleteFromList(int data);
void deleteLowerThan(int lower);
void calculateArithmetic();
void showList();
};
#endif
Cpp文件
List::List() {
this->head = NULL;
}
void List::insertList(int n) {
Node* new_node = new Node();
new_node->data = n;
new_node->next = head;
head = new_node;
}
void List::deleteFromList(int n) {
Node* temp = head;
Node* prev = NULL;
if (temp != NULL && temp->data == n) {
head = temp->next;
return;
}
while (temp->data != n && temp != NULL) {
prev = temp;
temp = temp->next;
}
if (temp == NULL) return;
prev->next = temp->next;
}
void List::deleteLowerThan(int n) {
Node* temp = head;
while (temp != NULL) {
if (temp->data < n) {
deleteFromList(temp->data);
}
else {
temp = temp->next;
}
}
}
void List::showList()
{
Node* temp = head;
while (temp != NULL)
{
cout << temp->data << " ";
temp = temp->next;
}
}
驱动程序
int main() {
List lista;
lista.insertList(2);
lista.insertList(4);
lista.insertList(6);
lista.insertList(8);
lista.insertList(3);
lista.insertList(1);
lista.insertList(-4);
lista.showList();
lista.deleteFromList(4);
lista.showList();
lista.deleteFromList(8);
lista.showList();
lista.deleteFromList(6);
lista.showList();
lista.deleteLowerThan(3);
lista.showList();
return 0;
}
问题出在您的deleteFromList
函数中,使用以下代码:
while (temp->data != n && temp != NULL) {
//...
这里,您正在尝试检查temp->data
之前]的值,已验证temp
是否为NULL
。因此,您将在某个时候(当您位于列表的末尾,并且temp
is NULL
会取消引用空指针-这不好!
相反,只需反转比较的顺序:
,并且循环将停止运行。while (temp != NULL && temp->data != n) { //...
这样,一旦
temp
为NULL
,将完全知道比较结果(请参阅short circuiting),将评估temp->data
not