我想从文件中读取学生姓名并将其插入到我的链接列表中,但是我遇到了这个错误框的问题。错误读取"表达式:无效的空指针。"
我用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;
}
}
答案 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 );
}