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