#c #linked-list #mergesort
#c #связанный список #сортировка слиянием
Вопрос:
Мне требуется отсортировать связанный список с помощью сортировки слиянием. Я собрал этот код, но столкнулся со странной ошибкой.
Мой связанный список заполнен случайными числами. Однако после сортировки отображаются только числа, которые больше первого элемента связанного списка, в отсортированном порядке.
Вот часть моего кода:
node* MergeSort(node *my_node)
{
node *secondNode;
if (my_node == NULL)
return NULL;
else if (my_node->next == NULL)
return my_node;
else
{
secondNode = Split(my_node);
return Merge(MergeSort(my_node),MergeSort(secondNode));
}
}
node* Merge(node* firstNode, node* secondNode)
{
if (firstNode == NULL) return secondNode;
else if (secondNode == NULL) return firstNode;
else if (firstNode->number <= secondNode->number) //if I reverse the sign to >=, the behavior reverses
{
firstNode->next = Merge(firstNode->next, secondNode);
return firstNode;
}
else
{
secondNode->next = Merge(firstNode, secondNode->next);
return secondNode;
}
}
node* Split(node* my_node)
{
node* secondNode;
if (my_node == NULL) return NULL;
else if (my_node->next == NULL) return NULL;
else {
secondNode = my_node->next;
my_node->next = secondNode->next;
secondNode->next = Split(secondNode->next);
return secondNode;
}
}
Ответ №1:
Я попробовал ваш код, и он работает отлично.
Вы посмотрели на правильный список в конце? Ваш новый заголовок списка — это не предыдущий заголовок, а возвращаемое значение функции слияния.
printList(myList);
node* sortedList = MergeSort(myList);
printList(sortedList); //whole list sorted
printList(myList); //list (of elements not smaller that first element) sorted
а printList() — очевидная функция:
void printList(node* my_node){
if(my_node == NULL) return;
else {
std::cout<<my_node->number<<" "<<std::endl;
printList(my_node->next);
}
}
Комментарии:
1. Ах, да. Я вижу, где я ошибался. Спасибо. Это исправлено.