2016-04-16 12 views
0

私のプログラムの目的は、ファイルからデータを読み込み、このデータを使ってリンクリストを作成し、使用されたすべてのノードの割り当てを解除することです。リンクされたリストクラス

プログラムはまた、彼らが作成された後のノードのアドレスをプリントアウトする必要があり、それらは

#include <iostream> 
    #include <string> 
    #include <fstream> 

    #include "BigHero.h" 

using namespace std; 

// Linked List Struct 
struct Node{ 
    BigHero data; 
    Node* Next; 

    }; 

    // Funtion Prototypes 
    int countHeros(string,int&); 
    void createList(BigHero,int,Node*&,Node*&,Node*&); 
    void printList(Node*,Node*,Node*); 
    void deallocateList(Node*&,Node*&,Node*&); 

    int main() 
{ 
     // Program Variables 
     Node* head; 
     Node* currentPtr; 
     Node* newNodePtr; 

    string Filename = "ola5party.dat"; // File string varible 
    int charNumber = 0; // variable to hold number of Heroes 
    int i = 0; // Loop control varible 


    countHeros(Filename,charNumber); // Function call used to count number of Heros 

    ifstream inFile; 
    inFile.open(Filename.c_str()); 
    if(!inFile){ 
    cout << "Error in opening file" << endl; 
    return 0; 
    } 

     BigHero Hero; 
    while(inFile) 
     { 
      inFile >> Hero; 
      createList(Hero,charNumber,head,currentPtr,newNodePtr); 
     } 

    printList(head,currentPtr,newNodePtr); 

    deallocateList(head,currentPtr,newNodePtr); 




    inFile.close(); 

    return 0; 



} 

    int countHeros(string Filename,int& charNumber) 
    { 
    ifstream inFile; 
    inFile.open(Filename.c_str()); 
    string aLineStr; 
    while (getline(inFile, aLineStr)) 
     { 
      if (!aLineStr.empty()) 
      charNumber++; 
     } 

      inFile.close(); 
      return charNumber; 
    } 

    void createList(BigHero Hero, int charNumber,Node*& head, Node*& currentPtr, Node*& newNodePtr) 
    { 


     head = new Node; 
     head->data =Hero; 
     currentPtr = head; 

     newNodePtr = new Node; 
     cout << "Allocated # " << newNodePtr << endl; 
     newNodePtr->data = Hero; 
     currentPtr->Next = newNodePtr; 
     currentPtr = newNodePtr; 




     } 

     void printList(Node* head, Node* currentPtr, Node* newNodePtr) 
     { 
       if(head != NULL) 
       { 
        currentPtr = head; 

        while(currentPtr->Next != NULL) 
        { 
         cout << currentPtr->data << endl; 
         currentPtr = currentPtr->Next; 
     } 

     } 

    } 

     void deallocateList(Node*& head ,Node*& currentPtr,Node*& newNodePtr) 
     { 
      if(head != NULL) 
      { 
       currentPtr = head; 
       while(head -> Next != NULL) 
       { 

        head = head->Next; 
        cout << "Deleting # " << head << endl; 
        delete currentPtr; 
        currentPtr = head; 


      } 
      delete head; 

      head = NULL; 
      currentPtr = NULL; 


      } 
     } 

を削除され、その後、このようなプログラムはエラーなしで実行されますが、ここでは、入力すべての意志の問題があります情報が必要ですが、私は1つの可変英雄クラスしか持たないので、常に情報を置き換えています。

私はクラス配列(例のヒーロー[i])を作ろうとしましたが、それは正しいと思われますが、それが解決策であるかどうかは分かりません。すべては大丈夫ですが、私はクラスオブジェクトの希望数を取得カントと私は常に一つのクラス

で終わるこれは私の所望の出力ですが、私は唯一のクラスオブジェクト

 Allocated#0x8722178 
    Allocated#0x87221d0 
    Allocated#0x8722210 
    Allocated#0x8722230 
    Allocated#0x8722288 
    Allocated#0x87222c8 
    Hero:MacWarrior­Level134,(34,16,48)­Exp:13425 
    Hero:LinuxMage­Level149,(24,54,21)­Exp:14926 
    Hero:PCBard­Level122,(18,32,17)­Exp:12221 
    Hero:PythonThief­Level90,(24,18,61)­Exp:9001 
    Hero:CplusPaladin­Level159,(31,38,29)­Exp:15925 
    Deleting#0x8722178 
    Deleting#0x87221d0 
    Deleting#0x8722210 
    Deleting#0x8722230 
    Deleting#0x8722288 
    Deleting#0x87222c8 

答えて

1

を取得するあなたが誤解しているようですリンクの背後にある基本的な考え方。あなたは要素を追加するときに何度も何度も上書きしてはなりません。 headは、リストが空の場合にのみ変更します。また、テールポインタを有することがしばしば良いパフォーマンスを得るために

struct Node 
{ 
    BigHero data; 
    Node* next; 
}; 


void addNewNode(Node*& head, ....) 
{ 
    if (head == nullptr) 
    { 
     // List empty so add new node as head 
     head = new Node; 
     head->next = nullptr; 
     return; 
    } 

    // Find last element in list (performance can be improved with a tail*) 
    Node* temp = head; 
    while (temp->next != nullptr) temp = temp->next; 

    // Add new element to end of list 
    temp->next = new Node; 
    temp->next->next = nullptr 

    return;   
} 

int main() 
{ 
    Node* head = nullptr; 

    addNewNode(head, ....); 

    return 0; 
} 

はこのような何かを試してみてください。

headmain()に定義してはいけませんが、クラス/構造体を作成して関連する関数をクラスに追加してください。 Like:

struct Node 
{ 
    BigHero data; 
    Node* next; 
}; 

class ListOfNode 
{ 
    public: 
    ListOfNode() : head(nullptr), size(0) {} 

    ~ListOfNode() 
    { 
     // Delete all nodes 
    } 


    void addNewNode(....) 
    { 
     // .... 

     ++size; 
    } 

    size_t size() { return size; } 

    private: 
    Node* head; // Optional: Add a tail* for better performance 
    size_t size; 
}; 

int main() 
{ 
    ListOfNode list; 

    list.addNewNode(....); 

    cout << list.size() << endl; 

    return 0; 
} 
+0

ありがとう – Zulu

関連する問題