2013-02-16 40 views
1

我有一個非常基本的疑問。我使用結構創建了鏈接列表,這是我的刪除代碼。如何在linklist中刪除後釋放節點C

void delete(int num) 
{ 
struct node* temp=head; 
struct node* prev=head; 
if(temp == NULL) 
printf("List Empty\n"); 
else 
{ 
while(temp != NULL) 
{ 
    if(temp->value == num) 
    { 
      prev=temp->next; 
      free(temp);  
      break; 
    } 
    else 
    {  
      prev=temp; 
      temp=temp->next;   

    } 
} 

運行此代碼後,該節點不會被刪除。如果我在空閒(temp)後打印temp-> value,則該值爲0.但是,情況並非如此。免費應該擦拭節點。所以我不明白0出現在哪裏。任何想法這個代碼有什麼問題?

我的播放功能:

void show() 
{ 
struct node *temp = head; 
while(temp != NULL) 
{ 
printf("---- %d ---- ", temp->value); 
temp=temp->next; 
} 
printf("\n\n"); 
} 

我的結構:

struct node 
{ 
int value; 
int pos; 
struct node* next; 
}; 

感謝。

回答

2

當你發現在delete節點:

if(temp->value == num) 
{ 
     prev=temp->next; 
     free(temp);  
     break; 
} 

你不會真的做下指針指向先前的節點下一個環節的節點。

相反,你應該做例如

prev->next = temp->next; 
+0

很酷。這處理所有情況下的頭部情況。如果我刪除第一個元素,我仍然得到0。那麼,根據我的代碼,如果我刪除temp,那麼head也會被刪除?我是否需要特殊條件來處理第一個節點的刪除? – darshshah 2013-02-16 20:04:44

+1

if(temp == head){head = temp-> next;}這個條件將處理這種情況。謝謝 – darshshah 2013-02-16 20:16:06