2011-12-11 2 views
1

작업은 연결된 목록을 역순으로하여 링크 된 목록을 만든 다음 인쇄가 끝난 다음 모든 역순으로 작업 한 다음 다시 인쇄합니다. 그러나 두 번째 인쇄는 비어 있습니다. 포인터 문제라고 생각 하나? 감사.연결된 목록 역방향

void reverseLinkedList(struct node** head) { 
    struct node* curr, *prev, *temp; 

    curr = *head; 
    prev = NULL; 

    while (curr) { 
     temp = prev; 
     prev = curr;   
     curr = curr->next; 
     prev = temp; 
    } 
    *head = prev; 
} 

struct node* buildLinkedList(int list[], int len) { 
    struct node* head = NULL; 
    struct node* tail = NULL; 
    struct node* node; 
    int i; 

    for (i = 0; i < len; i++) { 
     node = (struct node*) malloc(sizeof(struct node)); 
     node->data = list[i]; 
     node->next = NULL; 

     if (!head) { 
      head = node; 
     } else { 
      tail->next = node; 
     } 
     tail = node; 
    } 
    return head; 
} 

void printLinkedList(struct node** head) { 
    struct node* s = *head; 
    while(s) { 
     printf("%d\t", s->data); 
     s = s->next; 
    } 
    printf("\n"); 
} 

int main() { 
    int list [6] = {6,7,8,3,4,5}; 
    struct node* header = NULL; 
    header = buildLinkedList(list, 6); 
    printLinkedList(&header); 
    reverseLinkedList(&header); 
    printLinkedList(&header); 

} 

내가 콘솔에서 얻는 결과는 다음과 같습니다 두 번째 printLinkedList 아무것도 인쇄되지

6  7  8  3  4  5 

. 문제가있는 곳이 궁금합니다. 감사.

+0

코드를 단계별로 실행하고 디버거에서 데이터가 변경되는 것을 보았습니까? 그것은 오류를 찾을 때 많은 도움이 될 수 있습니다. – Tony

+0

투표의 마감 :이 문제는 디버거에서 코드를 실행하거나 printf 문을 여러 개 추가하여 중간 변수의 상태를 알려줌으로써 해결할 수 있습니다. –

답변

6

당신은

while (curr) { 
    temp = prev; 
    prev = curr;   
    curr = curr->next; 
    prev = temp; // <<-- this resets prev to what it was before. 
} 

당신이 next 포인터를 변경하지 않을,하지만 당신은 두 번 prev을 변경 목록을 반대하는 함수를 찾고 있습니다.

+0

고맙습니다. 예, 나는 마지막'prev-> next = temp'를 변경하고 감사장으로 일합니다. –