Удалить из однонаправленного списка отрицательные элементы - C (СИ)

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

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

Создать список из случайных положительных и отрицательных целых чисел (от –10 до 10) и удалить из него отрицательные элементы. Буду очень признателен за помощь.

Решение задачи: «Удалить из однонаправленного списка отрицательные элементы»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4.  
  5. typedef struct _TNode
  6. {
  7.     int value;
  8.     struct _TNode* next;
  9. }   TNode;
  10.  
  11. //-----------------------------------------------------------------------------
  12. TNode* Push(TNode** list, int value)
  13. {
  14.     TNode* node = malloc(sizeof(TNode));
  15.     node->value = value;
  16.     node->next = *list;
  17.  
  18.     *list = node;
  19.  
  20.     return *list;
  21. }
  22. //-----------------------------------------------------------------------------
  23. int Pop(TNode** list)
  24. {
  25.     TNode* node = *list;
  26.     int value = node->value;
  27.     *list = node->next;
  28.  
  29.     free(node);
  30.  
  31.     return value;
  32. }
  33. //-----------------------------------------------------------------------------
  34. int IsNegative(int value)
  35. {
  36.     return (value < 0);
  37. }
  38. //-----------------------------------------------------------------------------
  39. TNode* Remove(TNode** list, int (*Func)(int))
  40. {
  41.     TNode** node = list;
  42.  
  43.     while (*node)
  44.     {
  45.         if (Func((*node)->value))
  46.         {
  47.             Pop(node);
  48.         }
  49.         else
  50.         {
  51.             node = &(*node)->next;
  52.         }
  53.     }
  54.  
  55.     return *list;
  56. }
  57. //-----------------------------------------------------------------------------
  58. void Print(const TNode* list)
  59. {
  60.     for (; list; list = list->next)
  61.     {
  62.         printf("%d ", list->value);
  63.     }
  64.     printf("\n");
  65. }
  66. //-----------------------------------------------------------------------------
  67.  
  68. int main()
  69. {
  70.     TNode* list = NULL;
  71.     unsigned i = 10;
  72.  
  73.     srand(time(NULL));
  74.  
  75.     while (i--)
  76.     {
  77.         Push(&list, rand() % 20 - 10);
  78.     }
  79.  
  80.     Print(list);
  81.  
  82.     Remove(&list, IsNegative);
  83.  
  84.     Print(list);
  85.  
  86.     return 0;
  87. }

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

В данном коде используется однонаправленный список, представленный с помощью связного списка.

  1. Связной список - это структура данных, состоящая из узлов, каждый из которых содержит значение и ссылку на следующий узел.
    • Тип структуры: TNode - структура, представляющая узел связанного списка. Она содержит целочисленное значение (value) и указатель на следующий узел (next).
    • Алгоритмы работы со списком:
      • Добавление элемента в начало списка: функция Push.
      • Удаление последнего элемента списка: функция Pop.
      • Проверка, является ли значение отрицательным: функция IsNegative.
      • Удаление из списка элементов, удовлетворяющих условию: функция Remove.
      • Печать списка: функция Print.
  2. Основная функция - main.
    • Создание списка: инициализируем список как NULL.
    • Постановка задачи: генерируем случайные отрицательные и положительные числа в диапазоне от -10 до 10 и добавляем их в список.
    • Вывод списка на экран: вызываем функцию Print.
    • Удаление из списка отрицательных чисел: вызываем функцию Remove, передавая в качестве аргумента функцию IsNegative.
    • Вывод списка на экран после удаления: вызываем функцию Print.
    • Завершение работы программы: возвращаем 0. Таким образом, в данном коде решается задача удаления из однонаправленного списка отрицательных элементов.

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


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

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

15   голосов , оценка 4.067 из 5

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

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

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