Создайте два новых списка, в один из которых запишите все положительные элементы, в другой — остальные - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Народ, помогите плиз с написанием (уже кучу материала перечитал, все равно не могу написать). Задача с виду простая, но т.к. никогда не работал со списками не могу разобраться в синтаксисе. Дан список целых чисел. Создайте два новых списка, в один из которых запишите все положительные элементы, в другой - остальные элементы исходного списка. Списки являются односвязными, так же вывести на экран полученную информацию.

Решение задачи: «Создайте два новых списка, в один из которых запишите все положительные элементы, в другой — остальные»

textual
Листинг программы
#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.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.25 из 5
Похожие ответы