2016-10-11 7 views
0

Ich steckte einfach mit dem Problem paar Stunden, versuchen zu finden, wo mein Code bricht. Ich weiß, wie man die verknüpfte Liste löscht, aber etwas funktioniert nicht.Löschen verknüpfter LIst in C

Zuerst ist es eine sehr einfache Struktur mit einem Dataype von int und 2 struct * next und * prev.

struct _list_{ 
    struct _list_ *next; 
    struct _list_ *prev; 
    float distance; 
} 

Jetzt mache ich eine push_front-Funktion und es funktioniert super. Ich bekomme das Ergebnis, nach dem ich suche. Aber jetzt mache ich pop_front Funktion und etwas fehlt.

Die Funktion sollte die Entfernung zurückgeben und dann diese Liste aus der verknüpften Liste entfernen, aber ich kann es nicht machen.

hier ist der Code, den ich

int pop_front(list** header) 
{ 
    float number = (*header)->data; 
    list *head = *header; 
    list *remove = head; 

    // This should check if the pointer is pointing at the first element 
    while (head->prev != NULL) { 
    head = head->prev; 
    } 

    if (head) { 
    head = head->next; 
    free(remove); 
    remove = head; 
    remove->prev = NULL; 
    //if i remove the code below then i get this error 
    //*** Error in `./double_ended_queue.out': double free or 
    //corruption (fasttop): 0x0000000001d5a050 *** 
    //Pop up: 3 pointer: 3 Aborted (core dumped) 
    *header = *remove; 
    //And with this code i get a Segmentation fault (core dumped 
    return number; 
    } 
    return 0; 
} 

Jede Hilfe groß geschrieben wäre, danke.

P.S. überprüfte alle verknüpfte Liste Frage hier und keine half.

+1

das 'delete' ist ein reserviertes Schlüsselwort. Bitte benennen Sie es um. – learner

+1

Entweder das ist C und dann können Sie eine Variable namens 'delete' verwenden (obwohl ich es nicht empfehlen würde), oder es ist nicht und dann sollten Sie nicht. In beiden Fällen ist die Verwendung von * beiden * Sprach-Tags falsch. – usr2564301

+0

sry entfernt das C++ Tag – twistedhat

Antwort

0

Woher bekommst du diese Hausaufgaben? Die API-SUX. Hier jemand anderes hat fast die gleichen Hausaufgaben (Link, der auf meine Antwort, die links viele Probleme hat): Pointer Dequeue - pointer training

Anyways:

Haben Sie int oder float zurückkehren wollen? Die Elementdaten haben den Typ float, auch Ihre Variable "number", aber Ihre Funktion gibt int zurück.

int pop_front(list** header) 
{ 
    float number = (*header)->data; 

so, hier können Sie den Wert des Elements erhalten Sie zu entfernen sind versucht, aber dann ...

list *head = *header; 
    list *remove = head; 

    // This should check if the pointer is pointing at the first element 
    while (head->prev != NULL) { 
    head = head->prev; 
    } 

... Sie tatsächlich für das Element Suche zu entfernen.

Offensichtlich haben Sie es andersherum zu tun:

int pop_front(list** header) 
{ 
    list * head = *header; 
    while (head->prev) head = head->prev; 

jetzt, sollten Sie überprüfen, Wetter Sie die * Kopfzeiger anpassen müssen (und es sofort tun):

if (*header == head) { 
     *header = head->next; 
    } 

Das einzige, was jetzt zu tun ist, ist das Objekt aus der Liste zu entfernen, seinen Wert zu bekommen und den Speicher vor der Rückkehr zu befreien.

head->next->prev = NULL; 
    float retval = head->data; 
    free(head); 
    return retval; 
} 

Als Übung Sie links: Stellen Sie sicher, dass eine leere Liste nicht abstürzt;)

/edit: Dies wird auch für die Entfernung des letzten Elements zum Absturz bringen, so dass Sie haben zwei Übungen links ;)

+0

eine einfache Frage kann ich * header = NULL machen; in c? – twistedhat

+0

wenn ich das letzte Element herausnehme. – twistedhat

+0

ja. "* header" ist das Objekt, auf das "header" zeigt, und da es nicht const ist, können Sie ihm einen Wert zuweisen. NULL ist ein Wert. Sie können also NULL zuweisen. –