2015-12-15 61 views
0
struct Node{ 
int data; 
struct Node* next; 
}; 
struct Node* head; 
void Insert(int x){ 
    struct Node* temp = (struct Node*)malloc(sizeof(struct Node)); 
    temp->data=x; 
    temp->next=NULL; 
    head=temp; 
} 
void Print(){ 
    struct Node* temp=head; 
    printf("List is: \n"); 
    do{ 
     printf("%d", temp->data); 
     temp=temp->next; 
    }while(temp!=NULL); 
} 
int main(){ 
    head = NULL; 
    printf("How many numbers do you want to put into a list? \n"); 
    int n, i, x; 
    scanf("%d", &n); 
    for (i=0; i<n; i++){ 
     printf("Enter the number: \n"); 
     scanf("%d", &x); 
     Insert(x); 
     Print(); 
    } 
} 

此代碼僅打印最後一個元素。我已經多次檢查過了,我似乎無法找到這個錯誤。我會很感激如果有人能告訴我哪裏出了問題。這段代碼爲什麼只打印鏈表的最後一個元素?

在此先感謝

+1

不要投malloc'和朋友C. – Olaf

+0

的'結果因爲你總是讓'head'點到新創建的節點。之前的節點丟失。它也會造成內存泄漏。 – Haris

+1

歡迎來到Stack Overflow!這聽起來像你可能需要學習如何使用調試器來遍歷代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:[如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 –

回答

1

這兩句話:

temp->next=NULL; 
head=temp; 

會丟失先前插入的數據。使用

temp->next=head; 
head=temp; 

代替。這將使新的元素與之後的列表中的其餘部分一致。

+0

知道了,謝謝!我打算把 如果(臨時!= 0)temp-> next = head 這是它出錯的地方。但是如果你像你一樣寫的話,它會更整潔。 – sstefan

2
head=temp; 

此行將覆蓋您以前的head。這就是爲什麼你只能打印最後一個元素。

在鏈表中,有兩種類型的數據輸出:FIFO(先進先出)和LIFO(後進先出)。

例如:

Input = 1 2 3 4 

FIFO

Output = 1 2 3 4 

LIFO

Output = 4 3 2 1 

FIFO

你應該declar Ëstruct Node* tail;

temp->next=NULL;後你應該增加:

if(head==NULL){ 
    head=temp; 
    tail=temp; 
} 
else{ 
    tail->next=temp; 
    tail=temp; 
} 

請注意頭部不能在FIFO移動。因此我們需要使用tail來添加其他數據。

LIFO

temp->next=NULL;後你應該增加:

temp->next=head; 
head=temp; 
相關問題