释放循环链表

时间:2016-03-23 02:49:57

标签: c pointers linked-list

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

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 个答案:

答案 0 :(得分:0)

当你这样做时

while( *bestFriend != NULL)

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

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

答案 1 :(得分:0)

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

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