Сортировка односвязного списка по убыванию

Подскажите пожалуйста, я по пользовательскому вводу создаю односвязный список чисел, отбираю в отдельный список из него отрицательные числа и пытаюсь отсортировать его по убыванию. У меня работает отдельная сортировка первых двух элементов, но сортировка всех остальных элементов не работает. Я написал отладочную печать и ,к примеру, при попытке отсортировать список -2 -> -3 -> -4 -> -1 у меня выводится:

BEFORE: first: -2, second: -3, third: -4

AFTER: first: -3, second: -2, third: -4

BEFORE: prev-prev: -3, prev: -2, cur: -4, nxt: -1

AFTER: prev-prev: -3, prev: -2, cur: -4, nxt: -2

BEFORE: first: -3, second: -4, third: -2

AFTER: first: -4, second: -3, third: -2

Получен список c отсортированными отрицательными элементами:
-4 -3 -2

То есть отдельная сортировка первых двух элементов работает, а в другом блоке сортировки элементы теряются и не меняются. Подскажите пожалуйста, что нужно исправить в сортировке.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <locale.h>
#include <malloc.h>


struct list
{
    int inf;
    struct list* next;
};

struct list* ListInput(struct list* FIRST)
{
    int check_choice_input, check_element_input, choice;

    struct list* LAST, * CUR;

    FIRST = LAST = CUR = NULL;

    while (1)
    {
        printf("Добавить элемент 1 (Да) / 0 (Нет)?\n");
        check_choice_input = scanf("%d", &choice);
        if ((check_choice_input != 1) || ((choice != 1) && (choice != 0)))
        {
            printf("Некорректный ввод.\n");
            return NULL;
        }

        if (choice == 0)
        {
            break;
        }

        CUR = (struct list*)malloc(sizeof(struct list));

        if (CUR == NULL)
        {
            printf("Ошибка выделения памяти.\n");
            return NULL;
        }

        CUR->next = NULL;

        printf("Введите значение элемента:\n");
        check_element_input = scanf("%d", &CUR->inf);

        if (check_element_input != 1)
        {
            printf("Некорректный ввод.\n");
            return NULL;
        }

        if (FIRST == NULL)
        {
            FIRST = CUR;
            LAST = CUR;
        }
        else
        {
            LAST->next = CUR;
            LAST = CUR;
        }

    }

    return FIRST;
}


void main()
{
    struct list * FIRST_POS, * CUR_POS, * LAST_POS, * PREV_POS, * CHECKED, * BEFORE_CHECKED;
    struct list * FIRST_NEG, * CUR_NEG, * LAST_NEG, * PREV_NEG, * NEXT_NEG, *PREV_PREV_NEG;
    int flag_is_not_sorted = 1;

    FIRST_POS = CUR_POS = LAST_POS = NULL;

    setlocale(0, "");

    FIRST_POS = ListInput(FIRST_POS);

    if (FIRST_POS != NULL)
    {
        printf("Введён список:\n");

        for (CUR_POS = FIRST_POS; CUR_POS != NULL; CUR_POS = CUR_POS->next)
        {
            printf("%d ", CUR_POS->inf);
        }

        printf("\n");

        BEFORE_CHECKED = FIRST_POS;
        CHECKED = FIRST_POS->next;

        for (; CHECKED != NULL;)
        {
            if (CHECKED->inf < 0)
            {
                CUR_NEG = BEFORE_CHECKED->next;

                if (FIRST_NEG == NULL)
                {
                    FIRST_NEG = CUR_NEG;
                    LAST_NEG = CUR_NEG;
                }
                else
                {
                    LAST_NEG->next = CUR_NEG;
                    LAST_NEG = CUR_NEG;
                }

                BEFORE_CHECKED->next = CHECKED->next;
                CHECKED = CHECKED->next;

                CUR_NEG->next = NULL;
            }
            else
            {
                BEFORE_CHECKED = BEFORE_CHECKED->next;
                CHECKED = CHECKED->next;
            }
        }

        if (FIRST_POS->inf < 0)
        {
            CUR_NEG = FIRST_POS;

            if (FIRST_NEG == NULL)
            {
                FIRST_NEG = CUR_NEG;
                LAST_NEG = CUR_NEG;
            }
            else
            {
                LAST_NEG->next = CUR_NEG;
                LAST_NEG = CUR_NEG;
            }

            FIRST_POS = FIRST_POS->next;

            CUR_NEG->next = NULL;
        }

        printf("\n");

        printf("Получен список c положительными элементами:\n");

        for (CUR_POS = FIRST_POS; CUR_POS != NULL; CUR_POS = CUR_POS->next)
        {
            printf("%d ", CUR_POS->inf);
        }

        printf("\n");

        printf("Получен список c отрицательными элементами:\n");

        for (CUR_NEG = FIRST_NEG; CUR_NEG != NULL; CUR_NEG = CUR_NEG->next)
        {
            printf("%d ", CUR_NEG->inf);
        }

        while (flag_is_not_sorted)
        {
            if ((FIRST_NEG == NULL) || (FIRST_NEG->next == NULL))
            {
                flag_is_not_sorted = 0;
            }

            PREV_PREV_NEG = FIRST_NEG;
            PREV_NEG = FIRST_NEG->next;

            if (PREV_NEG->inf < PREV_PREV_NEG->inf)
            {
                printf("\nBEFORE: first: %d, second: %d, third: %d\n", FIRST_NEG->inf, FIRST_NEG->next->inf, FIRST_NEG->next->next->inf);
                PREV_PREV_NEG->next = PREV_NEG->next;
                FIRST_NEG = PREV_NEG;
                FIRST_NEG->next = PREV_PREV_NEG;
                printf("\nAFTER: first: %d, second: %d, third: %d\n", FIRST_NEG->inf, FIRST_NEG->next->inf, FIRST_NEG->next->next->inf);
            }
        
            PREV_PREV_NEG = FIRST_NEG;
            PREV_NEG = FIRST_NEG->next;

            for (CUR_NEG = PREV_NEG -> next; CUR_NEG != NULL; CUR_NEG = CUR_NEG->next)
            {
                
                if (CUR_NEG->inf < PREV_NEG->inf)
                {
                    printf("\nBEFORE: prev-prev: %d, prev: %d, cur: %d, nxt: %d\n", PREV_PREV_NEG->inf, PREV_NEG->inf, CUR_NEG->inf, CUR_NEG->next->inf);
                    
                    PREV_NEG -> next = NEXT_NEG;
                    CUR_NEG -> next = PREV_NEG;
                    PREV_PREV_NEG -> next = CUR_NEG;
                    
                    printf("\nAFTER: prev-prev: %d, prev: %d, cur: %d, nxt: %d\n", PREV_PREV_NEG->inf, PREV_NEG->inf, CUR_NEG->inf, CUR_NEG->next->inf);
                }
                
                PREV_PREV_NEG = CUR_NEG;
                PREV_NEG = PREV_NEG;
            }

            PREV_NEG = FIRST_NEG;
            
            flag_is_not_sorted = 0;
            
            for (CUR_NEG = FIRST_NEG -> next; CUR_NEG != NULL; CUR_NEG = CUR_NEG->next)
            {
                if (PREV_NEG->inf > CUR_NEG->inf)
                {
                    flag_is_not_sorted = 1;
                    break;
                }
                
                PREV_NEG = CUR_NEG;
            }
        }

        printf("\n");

        printf("Получен список c отсортированными отрицательными элементами:\n");

        for (CUR_NEG = FIRST_NEG; CUR_NEG != NULL; CUR_NEG = CUR_NEG->next)
        {
            printf("%d ", CUR_NEG->inf);
        }
        
        PREV_POS = FIRST_POS;
        for (CUR_POS = PREV_POS->next; CUR_POS != NULL; CUR_POS = CUR_POS->next)
        {
            free(PREV_POS);
            PREV_POS = CUR_POS;
        }
        
        PREV_NEG = FIRST_NEG;
        for (CUR_NEG = PREV_NEG->next; CUR_NEG != NULL; CUR_NEG = CUR_NEG->next)
        {
            free(PREV_NEG);
            PREV_NEG = CUR_NEG;
        }
    }
}

Ответы (0 шт):