после добавления
newTail = smallest
при помещении наименьшего элемента в первый узел и добавлении
smallest = head
до вершины моего внешнего цикла while, я все еще сталкивался с бесконечным циклом. Я понял, что для начала мне нужно было указать хвосту на новый хвост в конце, сказав
tail = newTail
После этого моя функция все еще вызывала ошибку. Это ошибка произошла из-за того, что я пытался получить доступ к предыдущему члену NULL.
head = head->next //head is now NULL
head->prev = NULL //segfault
Эта ситуация возникла, когда в несортированном списке остался только один узел. Я исправил эту проблему, добавив оператор if внутри оператора if, который проверяет, является ли наименьший первый узел. Оператор if внутри проверил, был ли он также последним узлом (он же последний оставшийся узел)
//smallest is first node
if(smallest->prev == NULL)
{
//check if smallest is the ONLY node left
//if it is only node left, head = head->next makes head NULL
// so then head->prev = NULL causes segfault
if(smallest->next == NULL)
{
//break leaves while loops
//which is why you have to add the final node
//outside of the while loops
break;
}
else
{
head = head->next;
head->prev = NULL;
}
}
Когда остается один узел, он попадает в разрыв и выходит из обоих циклов while. Это означает, что последний узел никогда не был добавлен в отсортированный список. Чтобы исправить это, я просто использовал следующий код, прежде чем указывать головой и хвостом на их новый список.
smallest->prev = newTail;
smallest->next = NULL;
newTail->next = smallest;
newTail = smallest;