C++ 单链表不工作(C+;+;)

C++ 单链表不工作(C+;+;),c++,linked-list,C++,Linked List,下面的代码构建正确,但在运行时导致程序崩溃。谁能告诉我有什么问题吗。我怀疑DeleteNode函数有问题 #include <iostream> #include <cstdlib> using namespace std; class list { private: typedef struct node { int data; node* next; }* nodePtr; //this means that 'n

下面的代码构建正确,但在运行时导致程序崩溃。谁能告诉我有什么问题吗。我怀疑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;
}
#包括
#包括
使用名称空间std;
班级名单{
私人:
类型定义结构节点{
int数据;
节点*下一步;
}*nodePtr;//这意味着'nodePtr'将表示指向结构节点的指针
无受体头;
无受体电流;
nodePtr温度;
公众:
list(){//constructor
head=NULL;
电流=零;
温度=零;
};
void AddNode(int addData)//添加特定数据值
{
nodePtr n=新节点;
n->next=NULL;
n->data=addData;
if(head!=NULL){//如果已经设置了列表
电流=水头;
while(current->next!=NULL){//以到达列表中的最后一个节点
当前=当前->下一步;
}
当前->下一步=n;
}
else{//如果未创建列表
head=n;//新节点位于列表的前面
}
}
void DeleteNode(int delData)//删除特定数据值
{
nodePtr delPtr=NULL;
温度=水头;
电流=水头;
while(current!=NULL&¤t->data!=delData){//遍历整个列表并查找值(&F)
温度=电流;
当前=当前->下一步;
}
如果(current=NULL){//在列表中找不到数据值
下一步;
温度=水头;
}
删除delPtr;

cout在delete函数中,如果找不到节点,则删除delPtr

但是,delPtr从未被实例化或分配,因此您试图删除一些不存在的内容

始终在if语句中包含指针删除以避免此问题。请尝试以下操作:

if (delPtr) delete delPtr;

首先,很少有代码和文件管理备注:考虑将代码分为<代码> .H>代码>文件,其中声明类成员和<代码> .CPP 类成员被实现,这将使您的类易于理解,并且可能的错误更容易找到。

第二,处理包含指针的结构的一般建议是注意适当的资源管理,即指针定义、初始化和删除应谨慎处理。如果您是新手,请考虑使用已提供的智能指针工具,如:“通过指针保留对象的唯一所有权,并在

唯一\u ptr
超出范围时销毁该对象”

第三,使用调试器消除一些小错误,如:

if (current = NULL)
顺便说一句,使用
NULL
而不是指针文本
nullptr
表示的额外不准确

最后,在完成初始实现后,分别检查每个成员函数,然后再继续进行进一步的类扩展,否则您将面临来自多个源的错误累积的风险,这将使您的工作非常困难



您的第一个问题是以下行:

if (current = NULL)
实际上,此时您正在将
null
赋值给
current

这实际上应该是:

if (current == NULL)

除了这里的所有建议之外,您还可以使用一些安全的编程实践来尽早捕获bug

例如:你写的

if (current = NULL)
相反,尝试在LHS上写入正在检查的值,在RHS上写入变量,如下所示:

if ( NULL == current)
这里,如果你打错了

if (NULL = current)

编译器会抱怨。您现在有一个编译时错误,而不是运行时错误。这更容易查找和调试。

欢迎使用堆栈溢出!听起来您可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,您可以逐行执行程序,并查看它与代码的偏差您期待。如果您要进行任何编程,这是一个必不可少的工具。进一步阅读:解决此类问题的正确工具是调试器。在询问堆栈溢出问题之前,您应该逐行检查代码。有关更多帮助,请阅读。至少,您应该[编辑]您的问题包括一个重现您的问题的示例,以及您在调试器中所做的观察。我没有全部阅读,但是
if(current=NULL)
这也不太好,只需使用
std::forward_list
而不是自己重新滚动。如果这是一项自己完成的任务,你至少可以通过使用
std::unique_ptr
来管理内存,而不必担心删除错误。这当然不会导致问题,谁教你的因此?
if(delPtr)delete delPtr;
是多余的。
delete
nullptr
透明地工作。