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

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

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

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

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct _TNode {
  5.     int value;
  6.     struct _TNode* next;
  7. }   TNode;
  8.  
  9. typedef struct _TList {
  10.     TNode* head;
  11.     TNode* tail;
  12. }   TList;
  13.  
  14. //-----------------------------------------------------------------------------
  15. TList* Push(TList* list, int value) {
  16.     TNode* node = malloc(sizeof(TNode));
  17.     node->value = value;
  18.     node->next = NULL;
  19.  
  20.     if (list->head && list->tail) {
  21.         list->tail->next = node;
  22.         list->tail = node;
  23.     } else {
  24.         list->head = list->tail = node;
  25.     }
  26.  
  27.     return list;
  28. }
  29. //-----------------------------------------------------------------------------
  30. int Pop(TList* list) {
  31.     TNode* node = list->head;
  32.     int value = node->value;
  33.     list->head = node->next;
  34.  
  35.     if (list->head == NULL) {
  36.         list->tail = NULL;
  37.     }
  38.  
  39.     free(node);
  40.  
  41.     return value;
  42. }
  43. //-----------------------------------------------------------------------------
  44. int IsEmpty(const TList* list) {
  45.     return ((list->head == NULL) && (list->tail == NULL));
  46. }
  47. //-----------------------------------------------------------------------------
  48. TList* Clear(TList* list) {
  49.     while (!IsEmpty(list)) {
  50.         Pop(list);
  51.     }
  52.  
  53.     return list;
  54. }
  55. //-----------------------------------------------------------------------------
  56. void Print(const TList* list) {
  57.     const TNode* node = list->head;
  58.  
  59.     while (node) {
  60.         printf("%d ", node->value);
  61.         node = node->next;
  62.     }
  63.     printf("\n");
  64. }
  65. //-----------------------------------------------------------------------------
  66. void Divide(TList* list, TList* a, TList* b) {
  67.     int value;
  68.     while (!IsEmpty(list)) {
  69.         value = Pop(list);
  70.  
  71.         if (value < 0) {
  72.             Push(b, value);
  73.         }
  74.         else {
  75.             Push(a, value);
  76.         }
  77.     }
  78. }
  79. //-----------------------------------------------------------------------------
  80.  
  81. int main() {
  82.     TList list = {NULL, NULL};
  83.     TList a = {NULL, NULL};
  84.     TList b = {NULL, NULL};
  85.     const int CFactor[] = {-1, 1};
  86.  
  87.     int i = 10;
  88.  
  89.     while (i--) {
  90.         Push(&list, (i + 1) * CFactor[i & 1]);
  91.     }
  92.  
  93.     printf("source: "); Print(&list);
  94.     printf("\n");
  95.  
  96.     Divide(&list, &a, &b);
  97.  
  98.     printf("a: "); Print(&a);
  99.     printf("b: "); Print(&b);
  100.  
  101.     Clear(&a);
  102.     Clear(&b);
  103.  
  104.     return EXIT_SUCCESS;
  105. }

Объяснение кода листинга программы

В этом коде создаются два списка, один для хранения положительных чисел, а другой - для хранения отрицательных. Задача кода - разделить исходный список на два списка, отсортировав его элементы по знаку. Код начинается с определения структур и функций для работы со списками. Затем определяются функции для вставки элемента в список (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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы