Удалить из однонаправленного списка отрицательные элементы - C (СИ)
Формулировка задачи:
Создать список из случайных положительных и отрицательных целых чисел (от –10 до 10) и удалить из него отрицательные элементы.
Буду очень признателен за помощь.
Решение задачи: «Удалить из однонаправленного списка отрицательные элементы»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct _TNode
{
int value;
struct _TNode* next;
} TNode;
//-----------------------------------------------------------------------------
TNode* Push(TNode** list, int value)
{
TNode* node = malloc(sizeof(TNode));
node->value = value;
node->next = *list;
*list = node;
return *list;
}
//-----------------------------------------------------------------------------
int Pop(TNode** list)
{
TNode* node = *list;
int value = node->value;
*list = node->next;
free(node);
return value;
}
//-----------------------------------------------------------------------------
int IsNegative(int value)
{
return (value < 0);
}
//-----------------------------------------------------------------------------
TNode* Remove(TNode** list, int (*Func)(int))
{
TNode** node = list;
while (*node)
{
if (Func((*node)->value))
{
Pop(node);
}
else
{
node = &(*node)->next;
}
}
return *list;
}
//-----------------------------------------------------------------------------
void Print(const TNode* list)
{
for (; list; list = list->next)
{
printf("%d ", list->value);
}
printf("\n");
}
//-----------------------------------------------------------------------------
int main()
{
TNode* list = NULL;
unsigned i = 10;
srand(time(NULL));
while (i--)
{
Push(&list, rand() % 20 - 10);
}
Print(list);
Remove(&list, IsNegative);
Print(list);
return 0;
}
Объяснение кода листинга программы
В данном коде используется однонаправленный список, представленный с помощью связного списка.
- Связной список - это структура данных, состоящая из узлов, каждый из которых содержит значение и ссылку на следующий узел.
- Тип структуры: TNode - структура, представляющая узел связанного списка. Она содержит целочисленное значение (value) и указатель на следующий узел (next).
- Алгоритмы работы со списком:
- Добавление элемента в начало списка: функция Push.
- Удаление последнего элемента списка: функция Pop.
- Проверка, является ли значение отрицательным: функция IsNegative.
- Удаление из списка элементов, удовлетворяющих условию: функция Remove.
- Печать списка: функция Print.
- Основная функция - main.
- Создание списка: инициализируем список как NULL.
- Постановка задачи: генерируем случайные отрицательные и положительные числа в диапазоне от -10 до 10 и добавляем их в список.
- Вывод списка на экран: вызываем функцию Print.
- Удаление из списка отрицательных чисел: вызываем функцию Remove, передавая в качестве аргумента функцию IsNegative.
- Вывод списка на экран после удаления: вызываем функцию Print.
- Завершение работы программы: возвращаем 0. Таким образом, в данном коде решается задача удаления из однонаправленного списка отрицательных элементов.