2016-03-23 5 views
-1

Ich verstehe irgendwie, wie man sie befreit, aber ich bin ziemlich sicher, dass ich es in meinem Code falsch mache.Geben Sie eine kreisförmige verkettete Liste frei

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

es stürzt mein Programm ein bisschen unsicher, was es aber verursacht.

Edit: Rest-Code

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

Bitte zeigen Sie ein [minimal vollständiges und überprüfbares Beispiel] (https://stackoverflow.com/help/mcve) an. – kaylum

+0

Sie speichern den Knoten, den Sie gestartet haben, und halten an, wenn der nächste Knoten des aktuellen Knotens der Startknoten ist. – xaxxon

+0

@kaylum meinst du meine Ausgabe, oder nur mehr von meinem Programm? – Jude

Antwort

0

Wenn Sie das tun

while(*bestFriend != NULL) 

Sie vergessen, dass diese kreisförmig ist. Der nächste der zuletzt freigegebenen Knoten ist der erste freigegebene Knoten. Dies verursacht ein Problem, da der Speicher von Ihrem Programm freigegeben wurde. Dies führt zu einem Segmentierungsfehler.

Mein Vorschlag ist nicht die Liste in einem kreisförmigen Herrenhaus zu haben, es macht keinen Unterschied, nur ein nächster Zeiger ist nicht gefüllt.

0

Kreisförmige verknüpfte Liste wird nie auf NULL zeigen, vorausgesetzt, es hat einen oder mehrere Knoten.

Aber Sie tun while(*bestFriend != NULL) was bedeutet, dass Sie die angegebene Liste nicht als zirkulär behandeln.

Verwandte Themen