Я согласен с другими комментаторами в том, что для правильного ответа на этот вопрос требуется больше информации о начальных условиях вашей проблемы.Однако, сценарий, который приводит к сбою вашего кода, сразу приходит на ум.
Предположим, что plist является циклически связанным списком с тремя элементами: A <-> B <-> C <-> A и plist точкик A.
Когда ваш код выполняется, он будет: освобождать A, переходить к B, освобождать B, переходить к C, освобождать C, а затем переходить к освобожденной памяти, которая была A.Теперь ваш код взрывается.(или работает вечно)
Поскольку это двусвязный список, вы должны использовать свои предыдущие ссылки, чтобы обнулить свои следующие ссылки перед освобождением.И для хорошей меры, также аннулируйте свои предыдущие ссылки.
temp_nlist = n_list->next;
temp_nlist->prev = NULL;
if (n_list->prev != NULL) n_list->prev->next = NULL;
free(n_list);
n_list = temp_nlist;