Варианты ЛР 3

Ниже приведены варианты лабораторной работы ЛР 3 «Структуры, линейные списки и динамическая память». Basic — односвязный список Student; advanced — двусвязный; high — кольцевой список Value (enum + union). Все варианты читают input.txt и пишут результат в output.txt.

Варианты основной группы

Вариант 1. Разделение по score >= 4.5

Стабильно переставить записи: сначала все с score >= 4.5, затем остальные. Порядок внутри групп сохранить.

Пример ввода:

4
1 1 4.80
2 2 3.20
3 3 4.00
4 1 4.60

Пример вывода:

1 1 4.80
4 1 4.60
2 2 3.20
3 3 4.00

Вариант 2. Неуспевающие в конец

Стабильно переставить записи: сначала все с score >= 3.0, затем неуспевающие (score < 3.0).

Пример ввода:

4
1 1 4.00
2 2 2.50
3 3 3.80
4 1 2.90

Пример вывода:

1 1 4.00
3 3 3.80
2 2 2.50
4 1 2.90

Вариант 3. Чётные курсы в начало

Стабильно переставить записи: сначала чётные курсы, затем нечётные.

Пример ввода:

4
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80

Пример вывода:

2 2 3.50
4 4 3.80
1 1 4.00
3 3 4.90

Вариант 4. Удаление записей ниже порога

Удалить все записи с score < T. Запись ровно с T остаётся. Порядок оставшихся сохранить. T вводится после списка.

Пример ввода:

4
1 1 4.00
2 2 3.20
3 3 3.50
4 1 2.80
3.5

Пример вывода:

1 1 4.00
3 3 3.50

Вариант 5. Выше среднего — в начало

Вычислить средний score. Стабильно переставить записи: сначала те, у кого score >= среднего, затем остальные.

Пример ввода:

4
1 1 4.00
2 2 2.00
3 3 5.00
4 1 3.00

Пример вывода:

1 1 4.00
3 3 5.00
2 2 2.00
4 1 3.00

Вариант 6. Только заданный курс

Оставить только записи с course == K, где 1 <= K <= 6. Порядок сохранить. K вводится после списка.

Пример ввода:

4
1 1 4.00
2 2 3.50
3 2 4.90
4 3 3.80
2

Пример вывода:

2 2 3.50
3 2 4.90

Вариант 7. Удалить минимальные score

Найти минимальный score и удалить все записи с этим значением. Порядок оставшихся сохранить.

Пример ввода:

5
1 1 4.00
2 2 2.50
3 3 3.80
4 1 2.50
5 2 4.10

Пример вывода:

1 1 4.00
3 3 3.80
5 2 4.10

Вариант 8. Группы курсов 1–2, 3–4, 5–6

Стабильно переставить записи: сначала курсы 1–2, затем 3–4, затем 5–6.

Пример ввода:

5
1 3 3.00
2 1 4.00
3 5 2.50
4 2 3.50
5 4 4.50

Пример вывода:

2 1 4.00
4 2 3.50
1 3 3.00
5 4 4.50
3 5 2.50

Вариант 9. Развернуть вторую половину

Разделить список на две половины и развернуть вторую. При нечётном N средний элемент остаётся в конце первой половины.

Пример ввода:

5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10

Пример вывода:

1 1 4.00
2 2 3.50
3 3 4.90
5 5 4.10
4 4 3.80

Вариант 10. Поменять половины местами

Разделить список на две половины и поменять их местами. При нечётном N средний элемент остаётся в конце первой половины.

Пример ввода:

6
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
6 6 3.20

Пример вывода:

4 4 3.80
5 5 4.10
6 6 3.20
1 1 4.00
2 2 3.50
3 3 4.90

Вариант 11. Циклический сдвиг на K

Циклически сдвинуть список на K позиций вправо. 0 <= K <= N; при K = 0 или K = N список не меняется. K вводится после списка.

Пример ввода:

5
1 1 4.50
2 2 3.80
3 3 4.90
4 1 4.10
5 2 3.50
2

Пример вывода:

4 1 4.10
5 2 3.50
1 1 4.50
2 2 3.80
3 3 4.90

Вариант 12. Развернуть блоки по K

Развернуть каждый блок длины K (последний блок может быть короче). 1 <= K <= N. K вводится после списка.

Пример ввода:

5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
2

Пример вывода:

2 2 3.50
1 1 4.00
4 4 3.80
3 3 4.90
5 5 4.10

Вариант 13. Развернуть суффикс после K

Оставить первые K элементов, а суффикс после них развернуть. 0 <= K <= N. K вводится после списка.

Пример ввода:

5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
2

Пример вывода:

1 1 4.00
2 2 3.50
5 5 4.10
4 4 3.80
3 3 4.90

Вариант 14. Нечётные позиции, затем чётные

Стабильно переставить записи: сначала элементы на нечётных позициях (1, 3, 5, …), затем на чётных (2, 4, 6, …).

Пример ввода:

5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10

Пример вывода:

1 1 4.00
3 3 4.90
5 5 4.10
2 2 3.50
4 4 3.80

Вариант 15. Поменять соседние пары

Поменять местами каждые два соседних узла. При нечётном N последний узел остаётся на месте.

Пример ввода:

5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10

Пример вывода:

2 2 3.50
1 1 4.00
4 4 3.80
3 3 4.90
5 5 4.10

Вариант 16. Максимум в начало

Переставить запись с максимальным score в начало, сохранив порядок остальных. При нескольких максимумах берётся первый.

Пример ввода:

5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10

Пример вывода:

3 3 4.90
1 1 4.00
2 2 3.50
4 4 3.80
5 5 4.10

Вариант 17. Чередующееся слияние

Слить два списка, чередуя элементы. Если длины разные, остаток более длинного добавляется в конец.

Пример ввода:

3
10 1 4.00
30 3 4.90
50 5 4.10
2
20 2 3.50
40 4 3.80

Пример вывода:

10 1 4.00
20 2 3.50
30 3 4.90
40 4 3.80
50 5 4.10

Вариант 18. Слияние по порогу

Из первого списка взять записи с score >= T, из второго — с score < T. Сохранить порядок внутри каждой части. T вводится после второго списка.

Пример ввода:

3
1 1 4.50
2 2 3.20
3 3 5.00
2
4 4 3.90
5 5 4.20
4.0

Пример вывода:

1 1 4.50
3 3 5.00
4 4 3.90

Вариант 19. Слияние с дедупликацией

Слить два списка, отсортированных по id. При совпадении id оставить запись с большим score, при равенстве — первую. Результат — по возрастанию id.

Пример ввода:

3
1 1 4.00
3 2 4.50
5 3 3.00
3
2 1 3.50
3 2 4.90
6 3 4.10

Пример вывода:

1 1 4.00
2 1 3.50
3 2 4.90
5 3 3.00
6 3 4.10

Вариант 20. Удалить каждого K-го

Удалить каждый K-й узел (позиции 1-based). 1 <= K <= N. K вводится после списка.

Пример ввода:

5
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
3

Пример вывода:

1 1 4.00
2 2 3.50
4 4 3.80
5 5 4.10

Варианты повышенной сложности

Вариант П1. Разворот двусвязного списка

Развернуть двусвязный список, переставив ссылки prev и next.

Пример ввода:

4
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80

Пример вывода:

4 4 3.80
3 3 4.90
2 2 3.50
1 1 4.00

Вариант П2. Обмен половин

Поменять местами первую и вторую половины двусвязного списка. При нечётном N средний элемент остаётся в конце первой половины.

Пример ввода:

6
1 1 4.00
2 2 3.50
3 3 4.90
4 4 3.80
5 5 4.10
6 6 3.20

Пример вывода:

4 4 3.80
5 5 4.10
6 6 3.20
1 1 4.00
2 2 3.50
3 3 4.90

Вариант П3. Сдвиг двусвязного списка

Циклически сдвинуть двусвязный список на K вправо. 0 <= K <= N. K вводится после списка.

Пример ввода:

5
1 1 4.50
2 2 3.80
3 3 4.90
4 1 4.10
5 2 3.50
2

Пример вывода:

4 1 4.10
5 2 3.50
1 1 4.50
2 2 3.80
3 3 4.90

Вариант П4. Разделение по порогу

Разделить двусвязный список на два: score >= T и score < T. Вывести два блока, разделённые пустой строкой. T вводится после списка.

Пример ввода:

4
1 1 4.00
2 2 3.20
3 3 3.50
4 1 2.80
3.5

Пример вывода:

1 1 4.00
3 3 3.50

2 2 3.20
4 1 2.80

Вариант П5. Чередующееся слияние двусвязных списков

Слить два двусвязных списка, чередуя элементы. Остаток более длинного добавить в конец. Второй список вводится после первого.

Пример ввода:

3
10 1 4.00
30 3 4.90
50 5 4.10
2
20 2 3.50
40 4 3.80

Пример вывода:

10 1 4.00
20 2 3.50
30 3 4.90
40 4 3.80
50 5 4.10

Варианты высокого уровня

Вариант В1. Сдвиг кольца

Циклически сдвинуть кольцо на K вправо. Ввод: N K, затем N пар type value. 0 <= K <= N.

Пример ввода:

5 2
1 10
1 20
1 30
1 40
1 50

Пример вывода:

1 40
1 50
1 10
1 20
1 30

Вариант В2. Обмен половин кольца

Поменять местами две половины кольца. При нечётном N средний элемент остаётся в конце первой половины.

Пример ввода:

4
1 10
2 20.50
1 30
2 40.50

Пример вывода:

1 30
2 40.50
1 10
2 20.50

Вариант В3. Разделение кольца по типу

Разделить кольцо на два: сначала int (type = 1), затем double (type = 2). Порядок внутри типа сохранить. Вывести два блока через пустую строку.

Пример ввода:

4
1 42
2 3.14
1 -7
2 2.50

Пример вывода:

1 42
1 -7

2 3.14
2 2.50

Вариант В4. Слияние двух колец

Слить два кольца в одно, сохранив порядок ввода: сначала первое кольцо, затем второе.

Пример ввода:

3
1 10
2 20.50
1 30
2
2 40.50
1 50

Пример вывода:

1 10
2 20.50
1 30
2 40.50
1 50

Вариант В5. Разворот кольца

Развернуть кольцо, изменив направление обхода.

Пример ввода:

4
1 42
2 3.14
1 -7
2 2.50

Пример вывода:

2 2.50
1 -7
2 3.14
1 42

Подтверждение

—