Создайте два новых списка, в один из которых запишите все положительные элементы, в другой — остальные - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д