C语言 释放循环链表



我有点了解如何释放它们,但我很确定我在代码中做错了。

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

它使我的程序崩溃,有点不确定是什么原因造成的。

编辑:代码的其余部分

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 moren");
                    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("%sn",nameList[i]);
                }
          for(i = 0; i < listSize; i++){
                    free(nameList[i]);
                    free(nameList);
                }
            while( *bestFriend != NULL){
                    temptr = *bestFriend;
                    *bestFriend = (*bestFriend)->next;
                    free(temptr);
                    printf("Freedn");
                }

        }



    }

    return 1;
}

当你这样做时

while( *bestFriend != NULL)

你忘记了这是循环的。要释放的最后一个节点中的下一个将是您释放的第一个节点。这会产生一个问题,因为该内存已从程序中释放。这将导致分段错误。

我的建议是不要将列表放在圆形庄园中,只是下一个指针没有填充就没有区别。

循环链表永远不会指向NULL,因为它有一个或多个节点。

但是您正在这样做while( *bestFriend != NULL)这意味着您没有将给定的列表视为循环列表。

相关内容

  • 没有找到相关文章

最新更新