2016-10-02 74 views
1

嘗試瞭解如何正確設置將根據用戶指定的參數從鏈接列表中刪除的功能。所以我有一個名爲listglobal變量,它包含所有dog structs。如果鏈表中有多個結構,我可以通過列表刪除用戶想要刪除的節點,但由於某種原因,如果只有一個節點或者我想要刪除的節點是該列表的頭部,則該函數不會刪除它。任何方向這個問題將不勝感激。根據用戶輸入從鏈接列表中刪除節點

void remove_one(char* name) 
{ 


    struct dog *tempList = list; 
    struct dog *previous = NULL; 

    if (tempList == NULL) { 
     return; 
    } 

    while (tempList != NULL) { 
     if (strcmpi(tempList->name, name) == 0) { 


      if (previous == NULL) { 
       tempList = tempList->next; 
      } 


      else { 
       previous->next = tempList->next; 
       free(tempList); 
       tempList = previous->next; 
      } 

      return; 
     } 

     else { 
      previous = tempList; 
      tempList = tempList->next; 
     } 


    } 

    return; 

} 

回答

1

2個問題在這裏:

if (previous == NULL) { 
     tempList = tempList->next; 
      } 

首先,tempList是一個局部變量,這樣你就不會真正刪除頭。下一次在例程中輸入時,list仍然指向相同(有效)的值。

其次,你不釋放內存。

正確的代碼:

if (previous == NULL) { 
     list = tempList->next; // change global variable so head is "tempList->next" 
     free(tempList); // free templist memory else you get memory leak 
      }