2016-08-02 3 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 8,532,616 3 4 5 6 7 8,528,368 2,002,618,240

+0

'경우 (! 온도 = NULL) lista-> 헤드 = temp-> 이전,'응? 이것은 무엇을 하는가? 목록에 헤드 포인터 *와 꼬리 poiner *가 있는데, 어떻게해야합니까? –

+0

'printList'에서 완료되면'free (ptr)'를 호출합니다. 이것은'free (NULL)'과 아무런 관련이 없습니다. 아무 것도하지 않지만 어떤 목적으로도 필요하지는 않습니다. –

답변

1

I을 귀하의 기능을 printList 두 번 같은 목록에 (한 번 전에 한 번 및 목록을 반대로 한 후에) 당신이동안 귀하의 목록을 무료로 정의되지 않은 동작으로 이어질 것 같아요) (당신 대하여 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

를) 및 역방향 : 당신이 그것으로 수행하지 않을 때 물건을 해제하지 않는다> -다음 그 같은 메모리 위치에 액세스하고 작업하려고? 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