2013-06-05 43 views
0

我有一個向後退出的鏈接列表。當我想把它們放在前面時,我似乎在列表的後面增加了元素。 我的節點顯示如下:鏈接列表出現倒退

struct node{ 
int data; 
struct node* next;}; 

接下來,我設置的頭部和變量

int info,x,listLength; 
struct node *head = NULL; 
struct node *temp; 
printf("How many nodes?\n"); 
scanf("%d",&listLength); 

現在我提示列表中的一個新的條目,並沿着節點移動

for(x=1;x<=listLength;x++){ 
    printf("Insert an X value for node %d\n",x); 
    scanf("%d",&info); 
    temp = (struct node*)malloc(sizeof(struct node)); 
    temp->data = info; 
    temp->next = head; 
    head = temp; 
} 

最後我輸出結果並釋放內存空間

while(temp!=NULL){ 
    printf("WE GOT %d\n",temp->data); 
    temp = temp->next; 
} 
free(temp); 

但是,如果我輸入三個節點的輸入並輸入1,2然後輸入3,則輸出爲3,2,然後是1!我如何改變這個以確保節點被添加到正確的位置? 在此先感謝!

+0

您將節點插入列表的頭部 - 如果您想保持相同的順序,那麼您需要將它們追加到列表的尾部。 –

+0

其實,你*是把新的元素放在列表的前面。這就是爲什麼它們會以相反的順序結束(想想看,也許會在紙上模擬一遍)。如果你希望他們在列表中的順序與你添加它們的順序相同,那麼你需要將它們添加到列表的末尾,這將需要更復雜的列表結構(帶有末尾指針並且可能是某種反向鏈接取決於你可能想如何操作列表中的項目),或者你必須遍歷列表才能找到結束節點以添加新節點。 –

回答

0

你的代碼是說

temp->next = head; 
head = temp; 

所以要添加到列表中,而不是結束的開始,所以「逆序」是正確的。 要添加到最後,您需要跟蹤您添加的最後一個節點(例如,struct node tail),或者您需要從頭開始搜索下一個ptrs,直到next = null以查找添加新節點的位置。

另外:爲什麼free(temp)在最後?由於它在while(temp != NULL)之後,這意味着temp必須等於null。你想釋放整個列表還是什麼?

+0

出於好奇,是否增加了被認爲是不好的做法的列表的開始? – qsorted

+0

取決於您使用的列表 - 如果訂單「意味着某件事」,那麼它必須是正確的。如果它只是一個東西的集合(更像是一個集合而不是一個列表),那麼順序並不重要,所以添加到前面是好的。 – John3136

0

你的head指針指向最後一個對象,這就是爲什麼你得到的數字'倒退'。

輸入:1,2,3

頭[數據:3](最後一件事temp指出) - >下一個[數據:2] - >下一個[數據:1] - > NULL

0

它工作正常..你想把新節點放在列表的前面,對吧? 1之後,你添加了。所以現在列表將是:2-> 1,並且以相同的方式,3-> 2-> 1