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