Слияние -сортировка связанного списка

#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. Ах, да. Я вижу, где я ошибался. Спасибо. Это исправлено.