2016-08-02 28 views
1

Ich habe ein Problem mit diesem Teil des Codes. Mein Ziel ist es, eine doppelt verkettete Liste umzukehren. Ich erhalte ungültige Werte, wenn ich versuche, die umgekehrte Liste auszudrucken.Doppelt verkettete Liste umkehren - Mülldaten ausdrucken

typedef struct node{ 
    int val; 
    struct node* prev; 
    struct node* next; 
}Node; 

typedef struct list{ 
    Node* head; 
    Node* tail; 
}List; 

void pushFront(List* l, Node* node){ 
    if(l->head == NULL){ 
     l->head = node; 
     l->tail = node; 
     l->tail->next = NULL; 
    }else{ 
     l->head->prev = node; 
     node->next = l->head; 
     l->head = node; 
    } 
} 
void printList(List* list){ 

    Node *ptr = list->head; 
    while(ptr != NULL){ 
     printf("%i ",ptr->val); 
     ptr = ptr->next; 
    } 
    puts(""); 
    free(ptr); 
} 

void reverse(List* lista){ 

    Node* ptr = lista->head; 
    Node* temp = NULL; 
    while(ptr != NULL){ 
     temp = ptr->prev; 
     ptr->prev = ptr->next; 
     ptr->next = temp; 
     ptr = ptr->prev; 
    } 

    if(temp != NULL) 
     lista->head = temp->prev; 
    free(ptr); 
    free(temp); 
} 

Ausgang I erhalten:

Originalliste: 1 2 3 4 5 6 7

Reversed-Liste: 1 8532616 3 4 5 6 7 8528368 2002618240

+0

'if (! Temp = NULL) lista-> head = temp-> zurück;' nicht wahr? Was macht das? Die Liste hat einen Kopfzeiger * und einen Schwanzpointer *, was soll mit ihnen geschehen? –

+0

In Ihrer 'printList' nennen Sie' free (ptr) 'wenn getan, was gleichbedeutend mit' free (NULL) 'ist, was nichts macht, aber für keinen Zweck benötigt wird. –

Antwort

1

I Ich nehme an, du verwendest deine Funktion printList zweimal auf derselben Liste (einmal vor und einmal nach dem Umkehren der Liste), was zu undefiniertem Verhalten führt, wenn du deine Liste währendfrei machstund dann versuchen, mit den gleichen Speicherplätze zuzugreifen und arbeiten -> Sie kostenlos Ihre Sachen nicht, wenn Sie nicht mit ihm fertig sind:

void printList(List* list){ 

    Node *ptr = list->head; 
    while(ptr != NULL){ 
     printf("%i ",ptr->val); 
     ptr = ptr->next; 
    } 
    puts(""); 
    // free(ptr); --> Remove this line 
} 
1

Warum Sie die Knoten in drucke() und umgekehrt sind zu befreien()? In C sollten Sie Variablen, die zuvor zugewiesen wurden, nur mit malloc() freigeben. Wenn Sie Variablen in einer C-Funktion deklarieren, wird sie automatisch dem Stapel oder einem anderen Speicherbereich (oder sogar in den CPU-Registern) zugeordnet. Sie werden auch automatisch am Ende Ihrer Funktion freigegeben. Wenn Sie Ihre Knoten dynamisch zuweisen und sie dann in Ihrer "reverse" -Funktion freigeben, würde ich beim Lesen des freigegebenen Knotens mit Müll rechnen. Ich habe versucht, die "kostenlosen" Anrufe zu entfernen und der Code hat gut funktioniert. https://ideone.com/CN1MaC

#include <stdio.h> 

typedef struct node{ 
    int val; 
    struct node* prev; 
    struct node* next; 
}Node; 

typedef struct list{ 
    Node* head; 
    Node* tail; 
}List; 

void pushFront(List* l, Node* node){ 
    if(l->head == NULL){ 
     l->head = node; 
     l->tail = node; 
     l->tail->next = NULL; 
    }else{ 
     l->head->prev = node; 
     node->next = l->head; 
     l->head = node; 
    } 
} 
void printList(List* list){ 

    Node *ptr = list->head; 
    while(ptr != NULL){ 
     printf("%i ",ptr->val); 
     ptr = ptr->next; 
    } 
    puts(""); 
} 

void reverse(List* lista){ 

    Node* ptr = lista->head; 
    Node* temp = NULL; 
    while(ptr != NULL){ 
     temp = ptr->prev; 
     ptr->prev = ptr->next; 
     ptr->next = temp; 
     ptr = ptr->prev; 
    } 

    if(temp != NULL) 
     lista->head = temp->prev; 
} 

int main(void) { 
    List list = { NULL, NULL }; 
    Node nodeArr[7]; 
    int i; 

    for(i = 0; i < 7; i++) 
    { 
     nodeArr[i].val = 7 - i; 
     nodeArr[i].prev = NULL; 
     nodeArr[i].next = NULL; 
     pushFront(&list, &nodeArr[i]); 
    } 

    printList(&list); 
    reverse(&list); 
    printList(&list); 

    // your code goes here 
    return 0; 
} 

Ausgang:

1 2 3 4 5 6 7 
7 6 5 4 3 2 1 
Verwandte Themen