Сортировка односвязного списка по убыванию
Подскажите пожалуйста, я по пользовательскому вводу создаю односвязный список чисел, отбираю в отдельный список из него отрицательные числа и пытаюсь отсортировать его по убыванию. У меня работает отдельная сортировка первых двух элементов, но сортировка всех остальных элементов не работает. Я написал отладочную печать и ,к примеру, при попытке отсортировать список -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;
}
}
}