2014-02-21 56 views
1

我試圖創建一個程序,它從文本文件中讀取並將單詞存儲到單個鏈接列表中。我應該創建自己的鏈表,而不是使用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時,它給了我一個錯誤;與上述錯誤。任何理由爲什麼以及如何解決這個問題?

回答

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文件中。

+0

謝謝!所以{using}屬於.cpp文件,而不是.h文件。得到它了! – HanH1113