В двойном круговом связанном списке, если есть один узел, указатель next
и prev
должен указывать на себя. В insert()
вы делаете
if(start == NULL)
{
new_node->next = start;
new_node->prev = end;
......
, из-за этого указатели next
и prev
в конечном итоге указывают на NULL
, потому что start
и end
изначально установлены на NULL
. Теперь, когда вы вставляете другой элемент в список, вы в конечном итоге получаете доступ к NULL
указатель
while(ptr->next != start)
ptr = ptr->next;
, и именно поэтому вы наблюдаете завершение программы.
При вставке первого узла вы должны правильно установить указатели next
и prev
. В вашем коде просто установите указатель start
и end
перед настройкой next
и rev
, например:
if(start == NULL)
{
start = new_node;
end = new_node;
new_node->next = start;
new_node->prev = end;
}
Дополнительно:
- Использование
void
в качестве типа возврата функции main
не соответствует стандартам. Возвращаемый тип функции main
должен быть int
. - Следуйте хорошей практике программирования, всегда проверяйте возврат
malloc
. - Не применяйте возврат
malloc
.