2016-10-02 14 views
1

ユーザが指定したパラメータに基づいてリンクリストから削除する関数を適切に設定する方法を理解しようとしています。だからglobalの変数listにはdog structsがすべて含まれています。私はリストが複数の構造体がリンクされたリストにある場合、ユーザーが削除したいノードを削除することができます。何らかの理由でノードが1つしかない場合やノードが削除された場合は、それ。この問題の方向性は非常に高く評価されます。ここユーザ入力に基づいてリンクリストからノードを削除する

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は引き続き同じ(有効な)値を指しています。

第2に、メモリを解放しないでください。

正しいコード:

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