2016-10-02 78 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 
      }