2017-08-19 67 views
0

我已經在C中編寫了雙鏈表的代碼,並且它從頭到尾遍歷正確,但是從尾(遍歷尾)到頭都被卡住在一個無限循環中,只打印最後一個節點的數據,我無法弄清楚什麼是錯誤的。在雙向鏈表中不能遍歷從尾到尾

#include <stdio.h> 
#include <stdlib.h> 

struct node { 
    int data; 
    struct node *prev; 
    struct node *next; 
}; 
typedef struct node list; 

list *head, *current, *newn, *end; 

int main() { 
    int x, y; 
    current = (list*)malloc(sizeof(list)); 
    printf("enter data:"); 
    scanf("%d", &current->data); 

    current->next = NULL; 
    current->prev = NULL; 
    head = current; 
    printf("do you want to enter more:"); 
    scanf("%d", &x); 
    while (x == 1) { 
     current->next = (list*)malloc(sizeof(list)); 
     printf("enter data:"); 
     scanf("%d", &current->next->data); 
     current->next->prev = current->next; 
     current->next->next = NULL; 
     current = current->next; 
     end = current; 
     printf("do yo want to enter more:"); 
     scanf("%d", &x); 
    } 

    newn = head; 
    while (newn != NULL) { 
     printf("%d:%d:%d->", newn->prev, newn->data, newn->next); 
     newn = newn->next; 
    } 
    while (end->prev != NULL) { 
     printf("%d", end->data); 
     end = end->prev; 
    } 
} 
+4

我刪除標籤[標籤:C++]。這個社區中的人們區分C和C++非常嚴格。標記垃圾郵件不喜歡,可能會導致票數減... – Scheff

+0

'while(newn!= NULL)'不同於while(end-> prev!= NULL)' – Lou

+1

'current-> next-> prev = current - > next;' - >'current-> next-> prev = current;' – Marian

回答

2

放在一起從評論的答案,這裏是固定的代碼:

#include<stdio.h> 
#include<stdlib.h> 
struct node 
{ 
    int data; 
    struct node *prev; 
    struct node *next; 
}; 
typedef struct node list; 
list *head, *current, *newn, *end; 

void exitWithFail() { 
    printf("Error: exiting.\n"); 
    exit(1); 
} 

int main() 
{ 
    int x,y,r; 
    current = (list*)malloc(sizeof(list)); 
    printf("enter data:"); 
    r = scanf("%d",&current->data); 
    if (r != 1) exitWithFail(); 
    current->next = NULL; 
    current->prev = NULL; 
    head = end = current; 
    printf("do you want to enter more:"); 
    r = scanf("%d",&x); 
    if (r != 1) exitWithFail(); 
    while(x == 1) 
    { 
     current->next = (list*)malloc(sizeof(list)); 
     printf("enter data:"); 
     r = scanf("%d",&current->next->data); 
     if (r != 1) exitWithFail(); 
     current->next->prev = current; // problem No.1 
     current->next->next = NULL; 
     current = current->next; 
     end = current; 
     printf("do yo want to enter more:"); 
     r = scanf("%d",&x); 
     if (r != 1) exitWithFail();  
    } 
    newn = head; 

    while(newn != NULL) 
    { 
     printf("%d ",newn->data); 
     newn = newn->next; 
    } 
    printf("\n"); 
    while(end != NULL)  // Problem No. 2 
    { 
     printf("%d ",end->data); 
     end = end->prev; 
    } 
    printf("\n"); 
} 
+0

您還應該將'head = current;'更改爲'end = head = current;'以允許使用單個節點的列表。 – chqrlie

+0

並且總是驗證'scanf'的返回,以防止輸入非數字之外的無限循環,例如, 'if(scanf(「%d」,&current-> next-> data)!= 1){/ *處理錯誤或退出* /}'。 –

+0

@chqrlie。謝謝,爲了完整起見,這兩個建議都包含在內。 – Marian