Я решил сделать проект по дважды связанному списку, чтобы лучше понять его. Я уже сделал функции, которые вставляют узлы в голову и хвост, но теперь у меня возникают проблемы с введением узлов по значению. Вот функция:Дублированный список в C, вставить по значению
void f_insert_by_value(the_individual **head, char *str, int a) {
the_individual *current = *head, *temp = f_create(str, a);
if (*head == NULL) *head = temp;
else {
if (temp->age < (*head)->age) {
temp->next = (*head);
(*head)->prev = temp;
(*head) = (*head)->prev;
}
else {
while (temp->age > current->age && current->next != NULL) current = current->next;
if (current->next = NULL) {
temp->prev = current;
current->next = temp;
current = current->next;
}
else {
temp->prev = current->prev;
temp->next = current;
current->prev->next = temp;
current->prev = temp;
}
}
}
return;
}
вина Сегментация происходит по линии "current-> prev-> следующая = Темп". Я попытался напечатать адреса, чтобы понять, почему это происходит, и выяснил, что узел, который является первым на входе, всегда заканчивается тем, что его предыдущий элемент указывает на NULL. Может ли кто-нибудь объяснить, почему это происходит и как его можно исправить? Спасибо.
Чтобы избежать всех этих пограничных случаев (во-первых, prev = NULL) и т. Д., Многие люди реализуют эти списки, такие как статические фиктивный элемент, который подключен к краям списка. Затем вы не запрашиваете NULL, но если ваш указатель является адресом манекена, чтобы узнать, что вы находитесь спереди или сзади вашего списка. Когда вы вставляете новые узлы, этот небольшой трюк позволяет вам тестировать NULL-указатели повсюду. – BitTickler
@ пользователь2225104 имеет хороший совет. Хакерные обходные пути, подобные этому, делают C fun –