2017-08-31 24 views
0

假設列表中已經有3個節點(即10,20)。我想插入30所以寫了如下C中的鏈表中的麻煩

struct node *p,*temp; 
p=start; 
temp=(struct node*)malloc(sizeof(struct node)); 
temp->info=30; 
temp->link=NULL; 
while(p-link!=NULL) 
{ 
    p=p->link; 
} 
p->link=temp; 

它完美地工作,直到我這樣做:while(p!=NULL)休息一樣.. 同樣在顯示我寫爲節點的情況下,如下

while(p!=NULL) 
    { 
     printf("%d \n",p->info); 
     p=p->link; 
    } 

這也工作得很好,直到我改變它:while(p->link!=NULL)

我想知道發生了什麼,爲什麼不工作? 如果在插入任何節點的情況下顯示所有數據,while(p-> link!= NULL),給我說明爲什麼while(p!= NULL)的原因?

+2

'而(對鏈路= NULL;!!'==>'而(對 - >鏈接= NULL)'' – mch

+4

P->鏈接= NULL'檢查是否'對 - > link'是一個空指針。'p!= NULL'檢查是否'p'是空指針。不是在至少相同。 –

+2

通過'而(對運行後!= NULL)'loop,'p'是'NULL',這意味着你不能用'* p'或'p-> link'來解引用它。 –

回答

1

在第一個while循環之前,你已經有了這樣的東西。兩個節點(而不是三個爲你的國家)在一個鏈表,指向start和一個新的節點,指向temp

start-->+---------+ +-->+---------+  +---------+<--temp 
     |info:10 | | |info:20 |  |info:30 | 
     |link:xxxx|--+ |link:NULL|  |link:NULL| 
     +---------+  +---------+  +---------+ 

到新節點添加到列表的末尾,你需要從在其link節點的第一個節點(由start指出),直到p點推進pNULL(即,直到p->link!=NULL不爲真):

start-->+---------+ +-->+---------+  +---------+<--temp 
     |info:10 | | |info:20 |  |info:30 | 
     |link:xxxx|--+ |link:NULL|  |link:NULL| 
     +---------+  +---------+  +---------+ 
          ^
          | 
         p -+ 

一旦你找到了最後一個節點,然後在你的新點頭中「垂下」 E要得到一個三元素的列表:

start-->+---------+ +-->+---------+ +-->+---------+ 
     |info:10 | | |info:20 | | |info:30 | 
     |link:xxxx|--+ |link:yyyy|--+ |link:NULL| 
     +---------+  +---------+  +---------+ 

但是,當你打印所有節點,你的第一個節點開始p(即並且打印每個節點的細節直到p已經被設置爲NULL(即,p!=NULL未成立)。如果在p->linkNULL時停止,則不會打印最後一個節點。

+0

但是當我說p-> link!= null不是p在最後一個節點?作爲最後一個節點的鏈接是空的。 –

+0

是的。 'p'將指向原始列表的最後一個條目(info = 20;中間圖)。然後設置'p-> link = temp'將新節點添加到列表的末尾(底部圖)。 – TripeHound

+0

**因爲p-> link!= null也可以到達最後一個節點,那麼爲什麼我不能用它來顯示所有節點?**您的答案真的非常令人印象深刻。請回答這個最後一個問題,我全都定下來了。 –

0

鏈表,在C是包含數據和指向下一個元素的結構(也許一個指向前一個元素,但似乎並沒有被你的情況)。這將是這樣的:

struct node { 
    int data; //could be any type 
    struct node *next; 
}; 

要在列表的末尾插入元素,你需要去它的結束 - 當沒有下一個元素。爲此,請檢查node->next == NULL。然後你製作node->next = new_node

要在列表中找到一個元素,你需要循環所有元素,直到找到它。如果元素不在列表中,則需要防止用戶訪問無效元素,因此您測試node == NULL以安全完成循環。這種情況也適用於只打印列表中的所有數據 - 您需要覆蓋所有元素,測試會相同(如果您正在測試node->next == NULL,則會跳過最後一個元素)。