Функция: сортировка списка по возрастанию - 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;
        }
    }
}

Объяснение кода листинга программы

  1. В функции find_min ищется минимальный элемент в списке.
  2. Переменная next инициализируется значением head->nextPoint.
  3. В цикле перебираются все элементы списка, начиная со второго, сравнивая каждый элемент с минимумом, найденным на предыдущем шаге. Если текущий элемент меньше минимума, то он становится новым минимумом.
  4. Если найден новый минимум, то меняется указатель на текущий элемент списка.
  5. В функции sort_ascendant происходит сортировка списка по возрастанию.
  6. В цикле перебираются все элементы списка, начиная с первого.
  7. Для каждого элемента списка находится минимальный элемент из оставшейся части списка.
  8. Если найденный минимальный элемент не равен текущему элементу списка, то производится обмен значениями.
  9. Цикл продолжается до тех пор, пока список не будет отсортирован.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5
Похожие ответы