单链接列表不起作用(C ++)

时间:2016-10-13 17:18:19

标签: 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 '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;
}

4 个答案:

答案 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)

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