2016-11-07 10 views
0

C++で独自のLinkedListアプリケーションを作成しようとしています。今、私は助けが必要なところにくっついています。私のアプリケーションがアクセス違反のエラーを引き起こしていると私は理由を知りません。 何か助けていただければ幸いです。 liste - > remove(0)の後にメソッド "printList()"を削除すると(現在、このメソッドはリスト内のノードが1つしか使用されていません)、その作業はしていますが、出力を見たいです。メソッドprintList()をもう一度挿入すると、再びクラッシュします。ここでC++ LinkedList読み取りアクセス違反エラー

は私のコードです:あなたの '限られた範囲' で

LinkedList.cpp

#include "LinkedList.h" 
#include <iostream> 

LinkedList::LinkedList() { 
    head = NULL; 
    tail = NULL; 
} 

LinkedList::~LinkedList() { 
    std::cout << "Die Liste wurde aus dem Speicher gelöscht."; 
} 

int LinkedList::append(const char* text) { 
    //new Node 
    Node* node = new Node(); 
    node->setData(text); 
    node->setNext(NULL); 

    //temp pointer 
    Node* tmp = head; 
    if (tmp == NULL) { 
     //List empty && set first node to head 
     head = node; 
    } else { 
     //list not empty, find the end of the list 
     while (tmp->getNext() != NULL) { 
      tmp = tmp->getNext(); 
     } 
     tmp->setNext(node); 
    } 
    return 0; 
} 

int LinkedList::remove(int p) { 
    int counter = 0; 
    //temp pointer 
    Node* node = head; 
    delete node; 
    return 0; 
} 

void LinkedList::printList() { 
    Node* node = head; 
    if (node == NULL) { 
     std::cout << "Empty"; 
    } else if (node->getNext() == NULL) { 
     //only one node in the list 
     std::cout << node->getData() << " --> NULL" << std::endl; 
    } else { 
     do { 
      std::cout << node->getData() << " --> "; 
      node = node->getNext(); 
     } while (node != NULL); 
     std::cout << "NULL" << std::endl; 
    } 
} 

node.cpp

#include "node.h" 
#include <iostream> 

Node::Node() { 
    //NOTHING 
} 

Node::~Node() { 
    std::cout << "Node aus Speicher gelöscht."; 
} 

void Node::setData(const char* d) { 
    data = d; 
} 

void Node::setNext(Node* n) { 
    next = n; 
} 

const char* Node::getData() { 
    return data; 
} 

Node* Node::getNext() { 
    return next; 
} 

main.cppに

#include "LinkedList.h" 

int main() { 
    LinkedList* liste = new LinkedList(); 
    liste->printList(); 
    liste->append("10"); 
    liste->printList(); 
    liste->remove(0); 
    liste->printList(); 
    return 0; 
} 
+0

あなたの 'remove'関数は正しく実装されていません。新しいヘッドを割り当てたり、削除する予定のものを検索せずに、各コールでヘッドノードを削除しています。 –

+0

この削除機能は、より大きなリストでは機能しません。私の場合は、エラーの位置を突き止めるために1つの要素を扱うことしか意図していません。私は間違っていない場合は、私は動的に作成されたノードをすべての呼び出しで、頭ではなく削除していますか? – Tjatte

+0

その場合、 'remove'メソッドで' head'ポインタをnull(好ましくはnullptr)に戻してください。 –

答えて

0

removeあなたが削除する機能ヘッドノードを(node変数を介して)送信します。つまり、次にリストを印刷しようとすると、削除された値を使用しようとしているため、未定義の動作が呼び出されています。

一般的なケースでremove関数を実装する前に、ヘッドポインタをnullに設定する必要があります。

int LinkedList::remove(int p) { 

    if(head){ 
     delete head; 
     head = nullptr; 
    } 

    return 0; 
} 
関連する問題