2016-03-23 11 views
-1

私はそれを解放する方法を理解していますが、自分のコードで間違っているとはかなり確信しています。循環リンクリストをフリーにする

while(*bestFriend != NULL){ 
        temptr = *bestFriend; 
        *bestFriend = (*bestFriend)->next; 
        free(temptr); 
        printf("Freed\n"); 
       } 

私のプログラムをクラッシュさせると、何が原因であるのか分かりません。

編集:コード

の残り
int duckDuckBoot(jimmysFriend **bestFriend, int rounds, int howManyDucks, int numberOfFriends, int gameCounter){ 

    int roundCounter; 
    int i; 
    jimmysFriend *temptr; 
    temptr = *bestFriend; 
    roundCounter = 0; 
    if(rounds != 0){ 
    do{ 
     for(i = 0; i < howManyDucks;){ 
      i++; 
      if(i == howManyDucks){ 
        temptr = temptr->next; 
       if((*bestFriend)->next == *bestFriend){ 
        temptr = *bestFriend; 
        free(temptr); 
        *bestFriend = NULL; 
        printf("Game %d:\n", gameCounter); 
        printf("Jimmy has friends no more\n"); 
        return 0; 
       } 
       else if(temptr->next == *bestFriend){ 
       jimmysFriend *temptr2; 
       while(temptr->next->next != *bestFriend){ 
         temptr = temptr->next; 
       } 

       temptr2 = temptr->next; 
       temptr->next = *bestFriend; 
       free(temptr2); 
       temptr = *bestFriend; 
       } 
       else if(temptr == *bestFriend){ 
        jimmysFriend *temptr2; 
        temptr2 = *bestFriend; 
        while(temptr->next != *bestFriend){ 
         temptr = temptr->next; 
        } 
        temptr->next = (*bestFriend)->next; 
        (*bestFriend) = (*bestFriend)->next; 
        free(temptr2); 
       } 
       else{ 
        jimmysFriend* temptr2; 
        temptr2 = *bestFriend; 

        while(temptr2->next->next != temptr->next){ 
         temptr2= temptr2->next; 
        } 
        jimmysFriend *temptr3; 
        temptr3 = temptr; 
        temptr2->next = temptr->next; 
        temptr = temptr->next; 
        temptr2 = NULL; 
        free(temptr3); 
        free(temptr2); 


       } 
       roundCounter++; 
       } 
      else{ 
      temptr = temptr->next; 
      } 


     } 

     }while(roundCounter != rounds); 
     if(roundCounter == rounds){ 
      char** nameList; 
      int listSize; 
      nameList = allocMemory(numberOfFriends); 
      listSize = dataTransfer(*bestFriend, nameList, numberOfFriends); 
      printf("Game %d:\n", gameCounter); 
      for(i = 0; i < listSize; i++){ 
       printf("%s\n",nameList[i]); 

       } 

      for(i = 0; i < listSize; i++){ 
        free(nameList[i]); 
        free(nameList); 
       } 
      while(*bestFriend != NULL){ 
        temptr = *bestFriend; 
        *bestFriend = (*bestFriend)->next; 
        free(temptr); 
        printf("Freed\n"); 
       } 


     } 







    } 


    return 1; 
} 
+2

[最小限の完全で検証可能な例](https://stackoverflow.com/help/mcve)を表示してください。 – kaylum

+0

現在のノードの次のノードが開始ノードのときに、開始したノードを保存して停止します。 – xaxxon

+0

@kaylumあなたは自分のアウトプットか、それとも私のプログラムのほうがいいですか? – Jude

答えて

0

あなたは、これが円形であることを

while(*bestFriend != NULL) 

忘れてください。解放される最後のノードの次のノードは、解放した最初のノードになります。これは、メモリがプログラムから割り当て解除されたため、問題が発生します。これにより、セグメンテーションフォルトが発生します。

私の提案は、循環的な魔法使いの中にリストを持たないことです。ただ一つの次のポインタが満たされないだけです。

0

循環リンクリストは、1つ以上のノードがある場合、NULLを指すことはありません。

あなたはwhile(*bestFriend != NULL)を実行しています。これは、指定されたリストを円形として扱っていないことを意味します。

関連する問題