Создайте два новых списка, в один из которых запишите все положительные элементы, в другой — остальные - C (СИ)
Формулировка задачи:
Решение задачи: «Создайте два новых списка, в один из которых запишите все положительные элементы, в другой — остальные»
#include <stdio.h> #include <stdlib.h> typedef struct _TNode { int value; struct _TNode* next; } TNode; typedef struct _TList { TNode* head; TNode* tail; } TList; //----------------------------------------------------------------------------- TList* Push(TList* list, int value) { TNode* node = malloc(sizeof(TNode)); node->value = value; node->next = NULL; if (list->head && list->tail) { list->tail->next = node; list->tail = node; } else { list->head = list->tail = node; } return list; } //----------------------------------------------------------------------------- int Pop(TList* list) { TNode* node = list->head; int value = node->value; list->head = node->next; if (list->head == NULL) { list->tail = NULL; } free(node); return value; } //----------------------------------------------------------------------------- int IsEmpty(const TList* list) { return ((list->head == NULL) && (list->tail == NULL)); } //----------------------------------------------------------------------------- TList* Clear(TList* list) { while (!IsEmpty(list)) { Pop(list); } return list; } //----------------------------------------------------------------------------- void Print(const TList* list) { const TNode* node = list->head; while (node) { printf("%d ", node->value); node = node->next; } printf("\n"); } //----------------------------------------------------------------------------- void Divide(TList* list, TList* a, TList* b) { int value; while (!IsEmpty(list)) { value = Pop(list); if (value < 0) { Push(b, value); } else { Push(a, value); } } } //----------------------------------------------------------------------------- int main() { TList list = {NULL, NULL}; TList a = {NULL, NULL}; TList b = {NULL, NULL}; const int CFactor[] = {-1, 1}; int i = 10; while (i--) { Push(&list, (i + 1) * CFactor[i & 1]); } printf("source: "); Print(&list); printf("\n"); Divide(&list, &a, &b); printf("a: "); Print(&a); printf("b: "); Print(&b); Clear(&a); Clear(&b); return EXIT_SUCCESS; }
Объяснение кода листинга программы
В этом коде создаются два списка, один для хранения положительных чисел, а другой - для хранения отрицательных. Задача кода - разделить исходный список на два списка, отсортировав его элементы по знаку. Код начинается с определения структур и функций для работы со списками. Затем определяются функции для вставки элемента в список (Push), удаления элемента из списка (Pop), проверки на пустоту списка (IsEmpty), очистки списка (Clear) и печати списка (Print). Функция Divide отвечает за разделение исходного списка на два списка. Она использует две переменные, a и b, для хранения положительных и отрицательных чисел соответственно. Пока список не пуст, функция извлекает следующий элемент из списка и проверяет его знак. Если число положительное, оно добавляется в список a, иначе - в список b. В функции main создаются три списка: исходный список, список a и список b. Затем в исходный список добавляются элементы с помощью функции Push. После этого исходный список печатается на экране. Затем вызывается функция Divide для разделения исходного списка на два списка. После разделения списки a и b печатаются на экране. Наконец, списки a и b очищаются с помощью функции Clear, и программа возвращает EXIT_SUCCESS.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д