创建自己的链接列表时出错

时间:2014-02-21 22:04:29

标签: c++ linked-list singly-linked-list

我正在尝试创建一个从文本文件中读取的程序,并将这些单词存储到单个链接列表中。我应该创建自己的链表而不是使用STL。我已经尝试查找了相当数量的教程,但我一直在变量“head”上出错。它说“节点的值类型不能用于初始化Node类型的实体”

这是List.cpp:

#include "List.h"
#include "Node.h"
#include <iostream>
using namespace std;

void List::add(string s){
    Node* newNode = new Node();
    newNode->addString(s);
    newNode->setNext(NULL);

    Node *temp = head;

    if(temp != NULL)
    {
        while(temp->Next() != NULL)
        {
            temp = temp->Next();
        }

        temp->setNext(newNode);
    }
    else
    { 
        head = newNode;
    }

}
void List::print(){
Node *temp = head;

    if(temp == NULL)
    {
        cout<<"EMPTY"<< endl;
        return;
    }
    if(temp->Next() == NULL)
    {
        cout<<temp->Word();
        cout<< "-->";
        cout<< "NULL" << endl;
    }
    else
    { do{
        cout<<temp->Word();
        cout<<"-->";
        temp = temp->Next();
    }
    while( temp != NULL);
    cout << "NULL" << endl;
    }
}
void List::read(ifstream& fin){
    while(!fin.eof())
        {
            fin>>sTemp;
            add(sTemp);
        }

}

这是Node.h

using namespace std;
#include <string>
class Node
{ string val;
Node* next;
public: 
    Node(void){}
    Node(string s)
    {
        val = s;
        next = nullptr;
    }
    void addString(string aString){ val = aString;};
    void setNext(Node* aNext){next = aNext;};
    string Word(){return val;};
    Node* Next(){return next;}; 
    string sTemp;
};

这是List.h

#include <string>
#include <fstream>
#include "Node.h"
using namespace std;
class List{
    Node* head;
public:
    List()
    {
        head = NULL;
    }
    void print();
    void add(string s);
    void find(string key);
    void read(ifstream& fin);
    string sTemp;
}

在实际的List.cpp下,当我说Node * temp = head时,它给出了一个错误;与上述错误。我有什么理由以及如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

此处的部分问题是List.cpp您已将Node.h两次包括在内。

  • 直接包含List.h,它本身包含Node.h
  • 直接包含Node.h

我很惊讶编译器没有警告你这件事。似乎它选择重新定义Node,因此最终会得到两个不兼容的Node值。您需要在头文件中添加包含防护以防止双重包含

List.h

#if !LIST_H
#define LIST_H
...
#endif

Node.h

#if !NODE_H
#define NODE_H
...
#endif

另请注意,在头文件中包含using语句通常被认为是不好的做法。而是在标头中使用名称空间限定名称,并将using语句放入.cpp文件中。