我有点了解如何释放它们,但我很确定我在代码中做错了。
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)
这意味着您没有将给定的列表视为循环列表。