我收到错误"无效的空指针"

时间:2014-03-23 18:11:14

标签: c++ debugging pointers null assertion

我想从文件中读取学生姓名并将其插入到我的链接列表中,但是我遇到了这个错误框的问题。错误读取"表达式:无效的空指针。"

我用Google搜索没有这样的运气。我想我已经知道我哪里出错了,但我不知道如何解决它。

如果你能提供帮助,那就太好了!

这是我的代码:

PS我几乎没有这么做,所以我的代码可能不完整,我现在只是试图清除我的所有错误,所以我最终不会有三倍的错误。

LLIST.H

#include <iostream>
#include <iomanip>
#include <string>

#ifndef LLIST_H
#define LLIST_H

typedef int ElementType;

class LList
{
public:
    LList();
    ~LList();
    void insert(std::string new_data);
    void display();
    void remove(std::string delete_data);

private:
    class Node
    {
    public:
        std::string data;
        Node *next;

        Node(std::string data_value = NULL);
    };

    Node *head;
    int mySize;
};

#endif LLIST_H

LList.cpp

#include <iomanip>
#include <iostream>
#include <string>
#include "LList.h"

using namespace std;

LList::Node::Node (string data_value)
{
    this -> data = data_value;
    this -> next = NULL;
}

LList::LList()
{
    this -> head = new Node(0);
    mySize = 0;
    string data = "";
}

LList::~LList()
{
    delete this -> head;
}

void LList::insert(string new_data)
{
    Node *tempHolder;
    tempHolder = this->head;

    while (tempHolder->next != NULL)
    tempHolder = tempHolder -> next;

    Node *newNode = new Node(new_data);
    tempHolder ->next = newNode;
    this->mySize++;
}

void LList::display()
{
    Node *temp;
    temp = head->next;

    while(temp -> next != NULL)
    {
        cout << temp -> data << endl;
        temp = temp -> next ;   
    }
}

void LList::remove(string delete_data)
{
    Node *tempHolder;
tempHolder = head;
while (tempHolder->next != NULL ) 
{
    if (tempHolder->next->data == delete_data)
   {
      Node *delete_ptr = tempHolder->next;
      tempHolder->next = tempHolder->next->next;
      delete delete_ptr;
      mySize-- ;
      break;
   } else
     tempHolder = tempHolder->next;
}
}

Main.cpp的

#include <iostream>
#include <iomanip>
#include <string>
#include "LList.h"
#include <fstream>

using namespace std;

int main()
{
    LList student;

    ifstream infile;
    char readLine[500];

    infile.open ("names.txt");

    if(infile.is_open())
    {
        while (!infile.eof()) 
         { 
            infile.getline(readLine,sizeof(readLine)); // read a line from file 
            student.insert(readLine); 
         } 
    }
    else
    {
        cout << "Can't open file!" << endl;
    }
}

2 个答案:

答案 0 :(得分:1)

我发现了我的问题。

在:

LList::LList()
{
    this -> head = new Node(0);
    mySize = 0;
    string data = "";
}

Node(0);

正在调用我的

LList::Node::Node (string data_value)
{
    this -> data = data_value;
    this -> next = NULL;
}

初始化为字符串。

我改变了

Node(0);

Node("");

它完美无缺。

答案 1 :(得分:0)

我想知道您可以在哪里阅读您可以写的参考资料吗?

Node(std::string data_value = NULL);

类std :: string没有将NULL转换为std::string类型对象的构造函数。

在没有默认参数

的情况下声明构造函数会好得多

Node(std :: string data_value);

创建没有数据的节点没有任何意义。

实际上,没有必要声明Node的构造函数。它可以用作聚合。

同时将LList的构造函数更改为

LList::LList() : head( 0 ), mySize( 0 ){}

析构函数也是无效的

LList::~LList()
{
    delete this -> head;
}

您不仅要删除头部,还要删除LList中的所有节点。

单个链表中的节点也会插入到头部之前的列表的开头。

如果不需要Node的构造函数,我会编写方法插入以下方法。

void LList::insert( const std::string &new_data )
{
   head = new Node { new_data, head };
}

如果您的编译器不支持初始化列表,那么您确实需要在Node类中定义构造函数。

Node( const std::string &data_value, next_node = NULL );

在这种情况下,方法插入将显示为

void LList::insert( const std::string &new_data )
{
   head = new Node( new_data, head );
}