2016-08-02 74 views
1

我遇到了這部分代碼的問題。我的目標是扭轉一個雙向鏈表。當我嘗試打印反向列表時收到垃圾值。雙向鏈表逆轉 - 打印出垃圾數據

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); 
} 

輸出I得到:

原始列表:1 2 3 4 5 6 7

反轉列表:1 8532616 3 4 5 6 7 8528368 2002618240

+0

'如果(!溫度= NULL)lista->頭= TEMP->分組;'是嗎?這是做什麼的?該列表有一個頭部指針*和一個尾巴*,他們會發生什麼? –

+0

在你的'printList'中,你完成時調用'free(ptr)',這相當於'free(NULL)',它不會做任何事情,但它不需要用於任何目的。 –

回答

1

我猜測你在同一個列表上使用你的函數printList兩次(在反轉列表之前一次和一次)導致未定義的行爲,因爲你在期間釋放你的列表,然後嘗試訪問和使用那些相同的內存位置 - >不釋放你的東西時,你是不是用它做:

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

你爲什麼中釋放的printList(節點)和反向()? 在C中,您應該只釋放以前分配的變量,例如使用malloc()。 當您在C函數中聲明變量時,它將自動分配給堆棧或其他內存區域(或甚至在CPU寄存器中)。它們也將在您的功能結束時自動釋放。 如果您動態分配節點,然後將它們釋放到「反向」函數中,那麼當您讀取釋放的節點時,我希望看到垃圾。 我試圖刪除「免費」的電話和代碼工作正常。 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; 
} 

輸出:

1 2 3 4 5 6 7 
7 6 5 4 3 2 1