2016-08-08 11 views
0

Dies ist meine erste Frage hier und mein Englisch ist nicht sehr gut, also bitte bitte mit mir.Verknüpfte Liste: Segmentierungsfehler Fehler beim Zuweisen eines Wertes zum nächsten Teil eines Knotens

Ich versuche, eine verkettete Liste mit einer Funktion zu erstellen, um ein Element an einer bestimmten Position einzufügen. Um dies zu tun, muss ich PREDPTR positionieren, aber ich habe Schwierigkeiten, es zu tun, denn immer, wenn ich das Programm starte, bekomme ich immer einen Segmentierungsfehler. Ich glaube, der Fehler ist in "predptr-> next = first;" Teil in der Funktion insert(), aber wenn ich predptr (die obige Zeile) auf "predptr = new Node()" setze, funktioniert es, aber es löst immer den zweiten Fall in der Insert-Funktion aus.

Hier ist der Code:

//Class List 
class List 
{ 
private: 

    //Class Node 
    class Node 
    { 
    public: 

    string data; 
    Node * next; 

    //Node constructor 
    Node() 
    { 
     data = ""; 
     next = 0; 
    } 

    //Node constructor with value 
    Node(string val) 
    { 
     data = val; 
     next = 0; 
    } 
    }; 

    int mySize; 
    Node * first; 

public: 

    //List constructor 
    List() 
    { 
    mySize = 0; 
    first = 0; 
    } 
//Insert Function 
    void insert(string val, int pos) 
    { 
    Node * newptr, * predptr; 
    newptr = new Node(val); 
    predptr = new Node(); 
    predptr->next = first; 

    cout << "Pred: " << newptr->data << endl; 

    //Position predptr 
    for(int i = 0; i < pos; i++) 
     predptr = predptr->next; 

    //CASE 1: Inserting at the middle or end of the List 
    if(predptr != 0) 
    { 
     cout << "NF" << endl; 
     newptr->next = predptr->next; 
     predptr->next = newptr; 
    } 
    //CASE 2: Inserting at the beginning of the List 
    else 
    { 
     cout << "F" << endl; 
     newptr->next = first; 
     first = newptr; 
    } 

    delete predptr; 
    mySize++; 

    } 
int main() 
{ 
    List a; 
    cout << (a.empty() ? "Yes" : "No") << endl; 
    cout << "Inserting 5 elements..." << endl; 
    a.insert("Asus", 1); 
    a.insert("Acer", 2); 
    a.insert("Sony", 3); 
    a.insert("Toshiba", 4); 
    cout << "List A: "; 
    a.display(); 
    cout << endl; 

    return 0; 
} 
+0

Die Methoden 'empty' und' display' fehlen. Wenn Zeilen, die diese Methoden aufrufen, auskommentiert sind, funktioniert alles einwandfrei. Also ist bei einer dieser Methoden wahrscheinlich etwas nicht in Ordnung. Ohne Code ist es unmöglich, den Bug zu finden – alexeykuzmin0

+0

predptr = predptr-> next; Was passiert, wenn Sie eine Pos und predptr-> nächste übergeben ist nicht gültig? - pos ist nicht an die Liste in diesem Code gebunden. –

Antwort

0

Der erste Hinweis, dass etwas nicht in Ordnung sein könnte, hier wäre, in insert():

newptr = new Node(val); 
predptr = new Node(); 

Regeln der Logik diktieren, dass, wenn insert() wird erwartet, dass ein Wert hinzufügen zu der Liste, dann wäre das Erstellen von zwei neuen Knoten statt einer offensichtlich falsch. Sie erwarten, hier nur einen neuen Knoten zu erstellen. Nicht zwei.

Die Logik in insert() ist völlig falsch. Kann wirklich nicht viel tun, um es zu retten. Die einzige Option hier ist, sie von Grund auf neu zu schreiben:

Node * newptr=new Node(val); 

Node **predptr=&first; 

while ((*predptr) && pos) 
{ 
    predptr= & (*predptr)->next; 
    --pos; 
} 

newptr->next= *predptr; 
*predptr=newptr; 

Das ist es. Wenn pos als 0 übergeben wurde, wird der neue Knoten an die erste Position in der Liste eingefügt, wenn 1, dann die zweite, usw. ... Dinge dieser Art sind 0-basiert. Wenn Sie möchten, dass Position # 1 anstelle von Position # 0 das erste Element der Liste ist, dekrementieren Sie einfach pos vor der Schleife.

Wenn pos die Größe der Liste überschreitet, stürzt der Code im Gegensatz zu Ihrem Versuch nicht ab, sondern fügen Sie einfach den neuen Knoten am Ende der Liste hinzu.

Ich werde dies in der Nähe mit einem Zitat: „Je mehr überdenken Sie die Sanitär-, desto einfacher ist es, die Drain zu stoppen up“

Scotty, Star Trek III.

Das Einfügen in eine verkettete Liste ist eine einfache Operation. Es sollte kein komplizierter Prozess sein.

+0

Hallo Sam Varshavchik! Sorry für die sehr späte Antwort. Es ist korrekt, aber unser Professor erklärte die Anweisungen nicht gründlich. Er erwartete von uns, dass wir den Algorithmus und die Codes aus dem Buch verwenden würden, damit er meine überarbeitete Arbeit nicht akzeptierte (entsprechend Ihrer Antwort). Aber immer noch danke für die Antwort. – nixon

+0

Sie müssen einen anderen Lehrer finden. Dein Lehrer ist inkompetent und tut mehr Schaden als Nutzen. Wenn Sie eine Karriere als Computerprogrammierer erwarten, werden Sie nicht viel von ihm lernen. –

Verwandte Themen