Используя динамическую структуру список подсчитать сумму отрицательных чисел в нем - C (СИ)
Формулировка задачи:
Решение задачи: «Используя динамическую структуру список подсчитать сумму отрицательных чисел в нем»
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct node_t { int value; struct node_t *next; } TList; //----------------------------------------------------------------------------- TList* Push(TList** list, int value) { TList* node = (TList*) malloc(sizeof(TList)); node->value = value; node->next = *list; *list = node; return *list; } //----------------------------------------------------------------------------- int Pop(TList** list) { int value = 0; if (*list) { TList* node = *list; *list = (*list)->next; value = node->value; free(node); } return value; } //----------------------------------------------------------------------------- void Clear(TList** list) { while (*list) { Pop(list); } } //----------------------------------------------------------------------------- void Print(TList* list) { for (; list; list = list->next) { printf("%d ", list->value); } printf("\n"); } //----------------------------------------------------------------------------- TList* GetGenList(size_t count, int min, int max) { TList* list = NULL; while (count--) { Push(&list, rand() % (max - min) + min ); } return list; } //----------------------------------------------------------------------------- int IsPositive(const TList* node) { return (node->value >= 0); } //----------------------------------------------------------------------------- int IsNegative(const TList* node) { return (node->value < 0); } //----------------------------------------------------------------------------- size_t Count(TList* list, int (*func)(const TList*)) { size_t count = 0; for (; list; list = list->next) { if (func(list)) { count++; } } return count; } //----------------------------------------------------------------------------- int Sum(TList* list, int (*func)(const TList*)) { int sum = 0; for (; list; list = list->next) { if (func(list)) { sum += list->value; } } return sum; } //----------------------------------------------------------------------------- int main() { srand(time(NULL)); TList* list = GetGenList(20, -100, 100); printf("list: "); Print(list); printf("sum of negative numbers = %d\n", Sum(list, IsNegative)); printf("count positive = %u\n", Count(list, IsPositive)); printf("count negative = %u\n", Count(list, IsNegative)); system("pause"); Clear(&list); return 0; }
Объяснение кода листинга программы
В данном коде используется динамическая структура - список (реализованный с помощью структур и связывающих элементов). Список содержит элементы типа int, каждый элемент списка связан с другим с помощью указателя next. Функция Push добавляет новый элемент в начало списка. Функция Pop удаляет и возвращает последний элемент списка. Функция Clear полностью очищает список. Функция Print выводит все элементы списка на экран. Функция GetGenList создает список случайных целых чисел от min до max (включительно). Функции IsPositive и IsNegative определяют, является ли значение в списке положительным или отрицательным соответственно. Функция Count подсчитывает количество элементов в списке, удовлетворяющих заданному условию (функции). Функция Sum суммирует все элементы в списке, удовлетворяющие заданному условию (функции). В функции main создается список из 20 случайных чисел от -100 до 100. Затем этот список выводится на экран. Далее, с помощью функции Sum подсчитывается сумма всех отрицательных чисел в списке. Затем, с помощью функции Count подсчитывается количество положительных и отрицательных чисел в списке. После этого система приостанавливается до нажатия клавиши. Наконец, список очищается с помощью функции Clear и программа завершается.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д