Сформировать связный список (стек), содержащий последовательность целых чисел - 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, которая содержит значение и указатель на следующий элемент списка. Далее определены функции:
- Push - создает новый узел списка, инициализирует его значение и добавляет его в начало списка.
- Print - проходит по всем элементам списка и выводит их значения через запятую.
- GetStack - считывает значения из файла и добавляет их в список.
- RemoveValue - проходит по всем элементам списка и удаляет первый элемент со значением равным указанному. В функции main создается связный список и выводится на экран. Затем список изменяется путем удаления первого элемента и снова выводится на экран. Если в командной строке указан аргумент, то список считывается из файла, иначе список пуст.