2016-10-23 1 views
-1

Ich baue also eine Funktion, die eine doppelt verknüpfte Warteschlange erstellt, und ich muss in der Lage sein, die Liste zu durchlaufen, die Daten jedes Knotens zu inkrementieren, bis es Null erreicht oder die Bedingung erfüllt ist. Aus irgendeinem Grund, wenn ich die queueTotal -Funktion ausführen, wenn der Betrag des letzten Knotens = 0 ist, und es in Else-Funktion in queueTotal geht, bekomme ich einen segfault. Ich stelle mir das vor, weil ich versuche, auf tail-> prev zuzugreifen und es wurde nie erklärt. Wie kann ich auf den vorherigen Knoten zugreifen?Fehler beim Zugreifen-> prev

isEmpty():

bool List::isEmpty() { 
    return head == 0; 
} 

Klasse Konstruktor:

List::List() { 
    head=0; 
    tail=0; 
} 

Überlastung =:

List::Node* List::operator= (Node* input) { 
    Node* cell = new Node; 
    cell->amount = input->amount; 
    cell->price = input->price; 
    cell->next = input->next; 
    cell->prev = input->prev; 
    return cell; 
} 

push (enqueue) Funktion:

void List::push(int amount, double price) { 
    Node* cell = new Node; 
    cell->amount = amount; 
    cell->price = price; 
    if(isEmpty()) { 
      tail = cell; 
    } 


    else { 
      head->prev = cell; 
    } 

    cell->next = head; 
    head = cell; 

queueTotal (dequeue) Funktion:

double List::queueTotal(int total, double price) { 
    Node * cell = new Node; 
      this->ListPrint(); 
    if (isEmpty()) std::cout << "Attempting to dequeue empty queue" << std::endl; 
    cell = tail; 
    double basis = 0.0; 
    double gain = total * price; 
    for (int i = 0; total; i++) { 

      if(cell->amount > 0) { 
        cell->amount -= 1; 
        total -= 1; 
      } 
      else { 
        basis += (i * cell->price); 
        i = 0; 
        if(head->next == 0) { 
          head = 0; 
        } 

        else{ 
          tail->prev->next = 0; 
        } 

        tail = tail->prev; 

      } 

    } 
    double subtotal = gain - basis; 
    totalGain += subtotal; 
    return subtotal; 

} 
+2

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+0

Push (Enqueue) -Funktion: 'if (isEmpty()) { Schwanz = Zelle; } '. Wenn Sie eine neue Daten in die Liste schieben, geben die Funktionen 'head' immer' null' und 'isEmpty()' immer true zurück. –

Antwort

0

In der Push-Funktion if (isEmpty()) {tail = Zelle; Kopf = Zelle; } Weil Sie den Kopf initialisieren müssen