以下代码构建正确但导致程序在运行时崩溃。有人可以告诉我它有什么问题。我怀疑DeleteNode函数有问题。
#include <iostream>
#include <cstdlib>
using namespace std;
class list {
private:
typedef struct node {
int data;
node* next;
}* nodePtr; //this means that 'nodePtr' will mean a pointer to the struct node
nodePtr head;
nodePtr current;
nodePtr temp;
public:
list() { //constuctor
head = NULL;
current = NULL;
temp = NULL;
};
void AddNode(int addData) //to add a particular data value
{
nodePtr n= new node;
n->next = NULL;
n->data = addData;
if (head != NULL) { //if a list is already set up
current = head;
while (current->next != NULL) { //to get to the last node in the list
current = current->next;
}
current->next = n;
}
else { // if list is not created
head = n; //new node is front of the list
}
}
void DeleteNode(int delData) //to delete a particular data value
{
nodePtr delPtr = NULL;
temp = head;
current = head;
while (current != NULL && current->data!=delData) { //pass through whole list && find value
temp = current;
current = current->next;
}
if (current = NULL) { //data value not found in list
cout << delData << " was not in the list." << endl;
delete delPtr; //to free up memory space
}
else {
delPtr = current;
current = current->next;
temp->next = current; //to reconnect list
if (delPtr == head) {
head = head->next;
temp = head;
}
delete delPtr;
cout << "The value " << delData << "was deleted." << endl;
}
}
void PrintList() //to print all the data values
{
current = head;
while (current != NULL) { //to go through the data valued of the list
cout << current->data << endl;
current = current->next;
}
}
};
int main()
{
list Shahzad;
Shahzad.AddNode(2);
Shahzad.AddNode(78);
Shahzad.AddNode(28);
Shahzad.AddNode(2398);
Shahzad.DeleteNode(78);
Shahzad.PrintList();
return 0;
}
答案 0 :(得分:2)
您的第一个问题是以下一行:
if (current = NULL)
此时您实际上将 null
分配给current
。
这应该是:
if (current == NULL)
答案 1 :(得分:1)
首先,很少有代码和文件管理备注:考虑将代码分成.h
文件,其中声明类成员,.cpp
实现类成员,这将使您的课程易于理解和可能错误将更容易找到。
其次,在处理包含指针的结构时的一般建议是注意适当的资源管理,即指针定义,初始化和删除应该谨慎处理。如果您是新手,请考虑使用已提供的智能指针设施,例如:std::unique_ptr
,它将“通过指针保留对象的唯一所有权,并在{{{3>}时销毁该对象{1}}超出范围“
第三,使用调试器来消除琐碎的错误,如:
unique_ptr
顺便说一下,在使用if (current = NULL)
而不是指针文字NULL
时表达了其他不准确之处。
最后,在完成初始实现后,分别检查每个成员函数,然后继续进行进一步的类扩展,否则您可能会从多个来源积累错误,这将使您的工作变得非常困难
答案 2 :(得分:0)
在您的删除功能中,如果找不到该节点,您将删除delPtr。
但是,delPtr从未实例化或分配过,所以你试图删除那些不存在的东西。
始终在if语句中包含指针删除以避免此问题。试试这个:
if (delPtr) delete delPtr;
答案 3 :(得分:0)
除了这里的所有建议外,您还可以使用一些安全的编程实践来及早发现错误。
例如:你写了
if (current = NULL)
相反,尝试在LHS上编写正在检查的值和RHS上的变量,如下所示:
if ( NULL == current)
在这里,如果您输入错误
if (NULL = current)
编译器会抱怨。您现在有一个编译时错误而不是运行时错误。这更容易找到和调试。