Лабораторная работаПрограммированиеГод: 2025ИТМО: Национальный исследовательский университет ИТМО
👁 10💼 0

Готовая лабораторная работа: связный список и разбиение по чётности

Загружена: 20.02.2026 06:46

Формирование отсортированного связного списка из N случайных чисел и одноразовое разделение его на два списка — чётные и нечётные значения. Описаны алгоритмы вставки в порядке не возрастания, однопроходная фильтрация и освобождение памяти — пригодно для практических занятий по структурам данных.

Содержание

Отчёт по лабораторной работе 4
Условие задачи
Сформируйте связный список из N элементов, содержащих случайные целочисленные значения от 1 до К (N и К вводятся с клавиатуры и должны быть натуральными). Значения в списке могут повторяться и должны располагаться в порядке не возрастания (значение следующего элемента списка меньше или равно текущего). 
Сформированный список выведите на экран. 
Затем сформируйте два новых списка из элементов исходного, выполнив по нему один проход. В первом списке должны располагаться элементы с четными значениями, а во втором с нечетными, при этом в обоих списках должен быть сохранен порядок не возрастания (один из списков может остаться пустым). Определяя местоположение очередного элемента в новом списке необходимо осуществлять проход от его начала. 
Оба списка выведите на экран. 
Пример: N = 6, К = 10. Значения исходного списка: 1 2 3 5 5 7. Список четных значений: 2. Список нечетных значений: 1 3 5 5 7.

Подробное описание

📘 О чем эта работа

Отчёт сопровождает программу на языке C, реализующую создание односвязного списка из N случайных целых чисел в диапазоне от 1 до K с поддержанием порядка не возрастания, а также его разбиение за один проход на два новых списка: для чётных и для нечётных значений. Объектом являются узлы списка (структура Node), предметом — алгоритмы вставки, фильтрации и управления памятью.

📚 Что внутри

В тексте подробно приведён исходный код программы и пояснения к нему:

  • Листинг функций: create_node() (выделение памяти для узла), insert_sorted() (вставка элемента так, чтобы сохранялся порядок не возрастания), print_list(), split_list() (однопроходное разделение на even/odd) и free_list() (освобождение памяти).
  • Генерация значений: используется srand((unsigned)time(NULL)) и rand() % K + 1 для получения чисел от 1 до K.
  • Проверка входа: валидируются N и K (натуральные числа), при неверном вводе программа завершает работу с сообщением об ошибке.
  • Пример работы: формирование списка, его вывод, затем вывод списка чётных и списка нечётных значений с сохранением порядка.
  • Комментарии в коде и пошаговое объяснение алгоритма: создание, вставка с проходом по началу списка для поиска места, разделение за один проход, вывод и очистка памяти.

📊 Для кого подходит

Материал полезен студентам и преподавателям курсов по программированию и структурам данных, практических занятий по языку C, а также тем, кто изучает динамическое выделение памяти, указатели и алгоритмы вставки в упорядоченные структуры.

✨ Особенности

Отчёт содержит полный рабочий код на C с пояснениями по каждому модулю. Реализация insert_sorted() гарантирует порядок не возрастания при добавлении новых элементов. split_list() выполняет фильтрацию за один проход, при этом для сохранения порядка новые элементы вставляются функцией insert_sorted(), что устраняет необходимость дополнительной сортировки. Приведены рекомендации по освобождению памяти, что предотвращает утечки.

❓ Частые вопросы

Подойдет ли для моего ВУЗа?
Структура и содержание соответствуют стандартным требованиям лабораторных по программированию: постановка задачи, алгоритм, листинг, пояснения и выводы.

Можно адаптировать?
Да. Легко заменить генерацию случайных чисел на ввод с клавиатуры или файл, изменить порядок на неубывающий, заменить insert_sorted() на вставку в конец для поддержания исходного порядка или реализовать оптимизированную структуру (например, двусвязный список).

Технические замечания: при больших N и худшем порядке вставки сложность формирования списка и последующих insert_sorted() при последовательных вставках может быть квадратичной O(N^2). Для больших объёмов рекомендуется альтернативная стратегия (например, сбор значений в массив и одна сортировка с последующей конвертацией в список).

Как проверять работу: запустить программу, ввести N и K; в выводе увидите исходный список в порядке не возрастания, затем список чётных и список нечётных значений; при N небольшого размера можно проследить корректность распределения и порядка.