Разбить список на 2 подсписка методом перераспределения - C (СИ)
Формулировка задачи:
У меня есть односвязный список элементов, нужно разбить список на 2 методом перераспределения элементов по признаку четности.
Прототип списка:
До этого я сделал методом переписи, но преподаватель говорит что так не годится, а как перераспределить элементы я не пойму.
typedef struct Node { int value; struct Node *next; } Node;
Решение задачи: «Разбить список на 2 подсписка методом перераспределения»
textual
Листинг программы
#include <stdlib.h> #include <stdio.h> typedef struct Node { int value; struct Node *next; } Node; void split_even_odd(Node *list, Node **even_list, Node **odd_list) { Node **even_next = even_list, **odd_next = odd_list; for (; list != NULL; list = list->next) if (list->value % 2 == 0) { *even_next = list; even_next = &(*even_next)->next; } else { *odd_next = list; odd_next = &(*odd_next)->next; } *even_next = *odd_next = NULL; } void print_list(const Node *list) { for (; list != NULL; list = list->next) printf("%d ", list->value); printf("\n"); } int main() { Node *list = &(Node) { 8, &(Node) { 5, &(Node) { 9, &(Node) { 6, NULL }}}}; print_list(list); Node *even_list, *odd_list; split_even_odd(list, &even_list, &odd_list); print_list(even_list); print_list(odd_list); }
Объяснение кода листинга программы
- Создается структура данных
узел
(Node), которая содержит целочисленное значение и указатель на следующий узел в списке. - Определяется функция split_even_odd, которая принимает указатель на начало списка, а также указатели на два подсписка (even_list и odd_list).
- В функции создаются два указателя even_next и odd_next, которые будут использоваться для перебора элементов списка и добавления их в соответствующие подсписки.
- Происходит итерация по всем элементам списка. Если значение элемента делится на 2 без остатка, то он добавляется в even_list, иначе в odd_list.
- После завершения цикла, указатели even_next и odd_next указывают на последний элемент в каждом из подсписков.
- Задается значение NULL для указателей even_next и odd_next, чтобы обозначить конец каждого из подсписков.
- В функции main создается список list, который содержит несколько подсписков.
- Вызывается функция print_list для вывода содержимого списка на экран.
- Создаются два указателя even_list и odd_list, которые будут использоваться для хранения подсписков even и odd.
- Вызывается функция split_even_odd, передавая ей указатель на список и указатели на even_list и odd_list.
- Выводится содержимое even_list и odd_list.
- В данном примере, после разделения списка на подсписки, выводится список [8, 5, 9, 6], состоящий из четных и нечетных чисел.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д