Сформировать связный список (стек), содержащий последовательность целых чисел - C (СИ)

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

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

Сформировать связный список (стек), содержащий последовательность целых чисел, вводимых из файла. Удалить из списка все нули. Язык С. Спасибо!

Решение задачи: «Сформировать связный список (стек), содержащий последовательность целых чисел»

textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
 
typedef struct node_t
{
    int value;
    struct node_t* next;
}   TNode;
 
//-----------------------------------------------------------------------------
TNode* Push(TNode** stack, int value)
{
    TNode* node = malloc(sizeof(TNode));
    node->value = value;
    node->next = *stack;
 
    *stack = node;
 
    return *stack;
}
//-----------------------------------------------------------------------------
void Print(const TNode* stack)
{
    for (; stack; stack = stack->next)
    {
        printf("%d, ", stack->value);
    }
    printf("\b\b \n");
}
//-----------------------------------------------------------------------------
TNode* GetStack(FILE* f)
{
    TNode* stack = NULL;
    int digit;
    while (fscanf(f, "%d", &digit) == 1)
    {
        Push(&stack, digit);
    }
 
    return stack;
}
//-----------------------------------------------------------------------------
TNode* RemoveValue(TNode** stack, int value)
{
    TNode** node = stack;
    TNode* tmp;
 
    while (*node)
    {
        if ((*node)->value == value)
        {
            tmp = *node;
            *node = (*node)->next;
            free(tmp);
        }
        else
        {
            node = &(*node)->next;
        }
    }
 
    return *stack;
}
//-----------------------------------------------------------------------------
 
int main(int argc, char* argv[])
{
    FILE* f = stdin;
 
    if (argc > 1)
    {
        f = fopen(argv[1], "r");
 
        if (f == NULL)
        {
            f = stdin;
            perror(argv[1]);
        }
    }
 
    TNode* stack = GetStack(f);
 
    Print(stack);
 
    RemoveValue(&stack, 0);
 
    Print(stack);
 
    return 0;
}

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

В данном коде реализованы основные операции со связным списком (стеком) в языке C: создание нового элемента списка (Push), вывод элементов списка (Print), чтение значений из файла и добавление их в список (GetStack), а также удаление элемента из списка по значению (RemoveValue). Код начинается с объявления структуры узла списка TNode, которая содержит значение и указатель на следующий элемент списка. Далее определены функции:

  1. Push - создает новый узел списка, инициализирует его значение и добавляет его в начало списка.
  2. Print - проходит по всем элементам списка и выводит их значения через запятую.
  3. GetStack - считывает значения из файла и добавляет их в список.
  4. RemoveValue - проходит по всем элементам списка и удаляет первый элемент со значением равным указанному. В функции main создается связный список и выводится на экран. Затем список изменяется путем удаления первого элемента и снова выводится на экран. Если в командной строке указан аргумент, то список считывается из файла, иначе список пуст.

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


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

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

8   голосов , оценка 3.75 из 5
Похожие ответы