2014-10-20 2 views
0

파일에서 문자열을 읽어 알파벳 순서 (C++)로 LinkedList에 삽입합니다. 나는 노드와리스트 클래스를 만들었지 만 뭔가 잘못되었다. Java에서이 작업을 수행했으며 문제없이 100 % 작동합니다. 이것은 내가 어딘가에서 포인터를 망쳐 놓았음에 틀림 없다고 믿게한다. 이것은 두 번째로 '->'기호를 사용하는 경우이기도합니다. 그래서 나는 그것을 어딘가에서 잘못 사용했을지도 모른다. 도움이되는 몇 가지 정보를 보내 주시면 감사하겠습니다. 미리 감사드립니다.오류는 없지만 출력이 올바르지 않습니다. 포인터 문제 가능

//NODE CLASS 
#include <string> 
#include <iostream> 
using namespace std; 

class Node { 
    string word; 
    int count; 
    Node* next; 

    public: 
    Node (string aWord) { 
     word = aWord; 
     count = 1; 
    } 

    Node (string aWord, Node* theNext) { 
     word = aWord; 
     next = theNext; 
    } 

    void increaseCount() { 
     count++; 
    } 

    string getWord() { 
     return word; 
    } 

    int getCount() { 
     return count; 
    } 

    Node* getNext() { 
     return next; 
    } 

    void setNext(Node* theNext) { 
     next = theNext; 
    } 
}; 

//LIST CLASS 
#include<iostream> 
using namespace std; 

class LinkedList { 
    Node* head; 

    public: 
    LinkedList() { 
     head = new Node(" "); 
    } 

    void insert(string word) { 
     Node* temp = head; 
     Node* previous = head; 

    while (temp != NULL && temp->getWord() < word) { 
     previous = temp; 
     temp = temp->getNext(); 
    } 

    if (temp == NULL) { 
     Node* node= new Node(word); 
     previous-> setNext(node); 
    } else { 
     if (temp-> getWord() == word) { 
      temp->increaseCount(); 
     } else if (temp->getWord() > word) { 
      Node* node = new Node(word, temp); 
      previous->setNext(node); 
     } 
     } 
    } 

    void print() { 
     Node* temp = head->getNext(); 
     while (temp != NULL) { 
      cout<< temp; 
      temp=temp->getNext(); 
     } 
    } 
}; 

//MAIN 
#include <iostream> 
#include <iostream> 
#include <fstream> 
#include "Node.h" 
#include "LinkedList.h" 
using namespace std; 

int main(int argc, const char * argv[]) { 

     ifstream inFile("WordsStatisticData1.txt"); 

     if (!inFile.is_open()) 
     cout<< "Could not open the file"<< endl; 

     else { 
      string readData; 
      LinkedList list = *new LinkedList(); //Probably a problem here 

      while (inFile >> readData) { 
       list.insert(readData); 
       inFile.close(); 

       list.print(); 
      } 
     } 
    } 

본인도 메인 내에서 완전히 잘못 선언 할 수 있습니다. 내 출력이 임의 문자가있는 '0x'주소와 비슷합니다.

+0

'LinkedList list = * new LinkedList();는 메모리 누수입니다. 어떻게 그걸 풀어 주죠? 사실, 나는 여기에 포인터가 전혀 필요 없다고 생각합니다. –

+0

참. 내 잘못이야. 이 부분에 대한 할당이 필요 없습니다. – Sgacedas

+0

@ DSib13 -'나는 Java에서이 작업을 수행했으며 문제없이 100 % 작동합니다. 'Java는 가비지 수집의 형태로 모든 동적 메모리 관리를 수행하기 때문에. 사실, 당신의 코드는'delete'에 대한 호출이 없기 때문에 메모리가 새어 나올 수 있습니다. 자바에서는 그다지 걱정하지 않아도됩니다. – PaulMcKenzie

답변

2

temp 인 경우 tempNode*입니다. 포인터는 객체의 주소 일 뿐이므로 출력에서 ​​주소를 얻는 이유는 무엇입니까?

Node에 포함 된 문자열을 가져오고 싶습니다. 그렇다면, 당신이 원하는 :

cout << temp->getWord(); 

당신이 가지고있는 또 다른 문제는 당신이 당신의 파일을 닫고 첫 번째 단어를 읽은 후 그것을 잘 일어날 것 즉, 루프 내부의 목록을 인쇄 할 것입니다. 루프를 후에 을 수행하면 파일의 모든 단어를 읽을 수 있습니다.

이와 같이 표시된 줄에 문제가 있습니다. new 키워드를 사용하면 동적으로 개체가 할당됩니다. 이러한 개체는 나중에 delete으로 삭제해야합니다. 그러나 동적으로 할당 된 객체 (참조 번호 *)를 역 참조하고 복사하면 동적으로 할당 된 객체에 대한 참조가 손실됩니다. 이는 고전적인 메모리 누출입니다. 여기서 동적 할당은 완전히 필요하지 않습니다. 그냥 :

LinkedList list; 
+0

오른쪽. 주소를 지우지 만 파일의 첫 단어 만 출력했습니다. – Sgacedas

+0

@ DSib13 다른 문제가 있습니다. 파일을 닫고 루프 * 후에 * 목록을 출력하려고 했습니까? –

+0

실제로 그런 식으로 정의 된 목록이 있었지만 XCode는 제안을 받아 들였습니다. 그래서 그것을 가져 와서 다시 사용하지 않았습니다. 대부분의 경우 출력이 정확합니다. 감사합니다. 그러나 중복 단어는 한 번만 나타나야 나타나는 횟수만큼 나타납니다. – Sgacedas

관련 문제