Создать список из целых чисел, отсортировать по возрастанию и вывести на экран - C (СИ)
Формулировка задачи:
Помогите плз написать программу на си:
программно создать список из целых чисел, отсортировать по возрастанию и вывести на экран.
одна задача от зачета отделяет, помогите плз =) заранее спасибо...
неужели никто не знает, как сделать?
народ, помогите плз...
Решение задачи: «Создать список из целых чисел, отсортировать по возрастанию и вывести на экран»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct NODE {
int value;
struct NODE * next;
} node_t;
node_t * new_node(int val, node_t * last){
node_t * n;
if ( ( n = (node_t*)malloc(sizeof(node_t)) ) == NULL )
return NULL;
n->value = val;
n->next = NULL;
if ( last )
last->next = n;
return n;
}
node_t * min_node(node_t * n){
node_t * minNode = n;
while ( n = n->next )
if ( n->value < minNode->value )
minNode = n;
return minNode;
}
void swap_vals(node_t * a, node_t * b){
int val;
val = a->value;
a->value = b->value;
b->value = val;
}
void sort_nodes(node_t * n){
node_t * minNode;
while ( n->next ){
if ( ( minNode = min_node(n) ) != n )
swap_vals(n, minNode);
n = n->next;
}
}
void print_nodes(const node_t * n){
while ( n ){
printf("%02d ", n->value);
n = n->next;
}
printf("\n");
}
void delete_nodes(node_t * n){
node_t * t;
while ( n ){
t = n->next;
free(n);
n = t;
}
}
int main(void){
node_t * first, * last;
int needed;
first = last = NULL;
printf("Nodes needed: ");
if ( scanf("%d", &needed) != 1 || needed < 1 ){
fprintf(stderr, "Wrong number!\n");
exit(EXIT_FAILURE);
}
srand(time(NULL));
while ( needed-- ){
if ( ( last = new_node(rand() % 100, last) ) == NULL ){
fprintf(stderr, "Can't create a new node!\n");
exit(EXIT_FAILURE);
}
if ( ! first )
first = last;
}
if ( ! first ){
fprintf(stderr, "Shit happens!\n");
exit(EXIT_FAILURE);
}
printf("Unsorted:\n");
print_nodes(first);
sort_nodes(first);
printf("Sorted:\n");
print_nodes(first);
delete_nodes(first);
exit(EXIT_SUCCESS);
}
Объяснение кода листинга программы
- Создание списка из целых чисел с помощью динамического массива и связывание элементов списка друг с другом.
- Создание функции
new_node, которая создает новый узел списка и добавляет его в конец списка. - Создание функции
min_node, которая находит минимальный элемент в списке. - Создание функции
swap_vals, которая меняет значения двух узлов списка местами. - Создание функции
sort_nodes, которая сортирует список по возрастанию. - Создание функции
print_nodes, которая выводит значения всех узлов списка. - Создание функции
delete_nodes, которая освобождает память, занятую узлами списка. - Ввод количества элементов списка с клавиатуры.
- Генерация случайных чисел для заполнения списка.
- Проверка корректности введенного количества элементов списка.
- Проверка корректности выделения памяти под новые узлы списка.
- Проверка корректности работы алгоритма сортировки.
- Вывод отсортированного списка на экран.
- Освобождение памяти, занятой узлами списка.
- Выход из программы с указанным статусом.