Функция: сортировка списка по возрастанию - C (СИ)
Формулировка задачи:
Помогите написать функцию сортировки по возростанию чисел для списка.
#include <stdio.h> #include <stdlib.h> #include <windows.h> struct list { int data; struct list *nextPoint; }; typedef struct list List; /* синоним к структуре list*/ typedef List *ListPtr; /* указатель на тип List*/ /* прототипы функций */ void create (ListPtr *start, char number); void print(ListPtr NowPoint); int main (void) { SetConsoleCP(1251); SetConsoleOutputCP(1251); ListPtr start = NULL; /* элементы отсутствуют */ int choice; char number; /* элемент списка */ while (choice != 3) { printf("\n\nВведите цифру:\n1. Добавить в список\n2. Вивести список\n3. Конець программы\n"); /* меню программы */ scanf("%i", &choice); switch (choice) { case 1: printf("Введите элемент:"); /* ввод нового элемента */ scanf("\n%c", &number); create(&start, number); /* обновление списка */ break; case 2: printf("\nРезультат:\n"); /* вывод списка на екран */ sort(&start, number); print(start); break; case 3: printf("\nЗавершення програми\n"); /* окончание программы */ break; default: printf("\nОшибка\n"); break; } } return 0; } void create (ListPtr *start, char number) { ListPtr NewPoint; /* новый элемент */ ListPtr OldPoint; /* ппредыдущий элемент */ ListPtr NowPoint; /* активный элемент */ NewPoint = malloc(sizeof(List)); /*создание элемента */ if (NewPoint != NULL) { /* если есть память */ NewPoint->data = number; /* записуем элемент */ NewPoint->nextPoint = NULL; /* активный элемент последний */ OldPoint = NULL; NowPoint = *start; if (OldPoint == NULL) { /* добавление нового элемента на начало списка*/ NewPoint->nextPoint = *start; *start = NewPoint; } else { OldPoint->nextPoint = NewPoint; NewPoint->nextPoint = NowPoint; } } else { printf("\nНет памяти.\n"); } } void print(ListPtr NowPoint) { if (NowPoint == NULL) { printf("\nСписок пуст\n"); } else{ while (NowPoint != NULL) { printf("%c ", NowPoint->data); NowPoint = NowPoint->nextPoint; } } }
Решение задачи: «Функция: сортировка списка по возрастанию»
textual
Листинг программы
struct list * find_min(struct list * head) { struct list * next; for ( next = head->nextPoint; next; next = next->nextPoint ) if ( next->data < head->data ) head = next; return head; } void sort_ascendant(struct list * list) { for ( ; list; list = list->nextPoint ) { struct list * minPtr = find_min(list); if ( minPtr != list ) { int tmp = list->data; list->data = minPtr->data; minPtr->data = tmp; } } }
Объяснение кода листинга программы
- В функции
find_min
ищется минимальный элемент в списке. - Переменная
next
инициализируется значениемhead->nextPoint
. - В цикле перебираются все элементы списка, начиная со второго, сравнивая каждый элемент с минимумом, найденным на предыдущем шаге. Если текущий элемент меньше минимума, то он становится новым минимумом.
- Если найден новый минимум, то меняется указатель на текущий элемент списка.
- В функции
sort_ascendant
происходит сортировка списка по возрастанию. - В цикле перебираются все элементы списка, начиная с первого.
- Для каждого элемента списка находится минимальный элемент из оставшейся части списка.
- Если найденный минимальный элемент не равен текущему элементу списка, то производится обмен значениями.
- Цикл продолжается до тех пор, пока список не будет отсортирован.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д