#include < stdio.h> //Библиотека функций ввода и вывода
#include < stdlib.h> //Библиотека стандартных функций
#include < string.h> //Библиотека функций обработки строк
int Push(const char *); //Помещение значения в стек
int Pop(char *); //Получение значения из стека
/* --------------- Главная функция main ---------------- */
int main(int argc, char *argv[])
{
//Если число параметров командной строки не равно двум,
if (argc != 2){ //то вывод сообщения и выход
puts("Неправильное количество параметров!");
return 0;
}
FILE *f = fopen(argv[1],"w"); //Открытие файла для записи
if (!f){ //Если открыть файл не удалось, то
puts("Невозможно открыть файл!"); //вывод сообщения
return 0; //выход
}
char str[50]; //Буфер для ввода и обработки данных
while (1){ //Цикл ввода
gets(str); //Чтение строки
if (strlen(str)==0) break ;//Если строка пустая, то выход
//Помещение введенной строки в стек
if (Push(str)) { //Если поместить в стек не удалось, то
puts("Мало памяти!"); //вывод сообщения
break ; //завершение ввода
}
}
//Цикл пока стек не пуст: чтение значения из стека и
while (!Pop(str)) fprintf(f,"%s\n",str); //запись в файл
fclose(f); //Закрытие файла
return 0; //Выход
}
/* ------ Описание структуры и указателя на стек ------- */
typedef struct _Element{
char str[50];
struct _Element *next;
} Element;
Element *head = NULL;
/* ---------- Функция помещения значения в стек -----------
Параметры: str - помещаемое значение.
Возвращаемое значение: 0 - успешное завершение,
1 - ошибка выделения памяти
-------------------------------------------------------- */
int Push(const char *str)
{
//Выделение памяти под новый элемент в стеке
Element *tmp = (Element *)malloc(sizeof (Element));
if (!tmp) return 1; //Если память не выделилась, то выход
strcpy(tmp->str,str); //Копирование значения в элемент
//Установка ссылки на следующий элемент на вершину стека
tmp->next = head;
//Установка указателя на вершину стека на новый элемент
head = tmp;
return 0; //Успешное завершение
}
/* --------- Функция получения значения из стека ---------
Параметры: str - полученное значение
Возвращаемое значение: 0 - успешное завершение,
1 - стек пуст
-------------------------------------------------------- */
int Pop(char *str)
{
if (!head) return 1; //Если стек пуст, то выход
//Установка локального указателя на вершину стека
Element *tmp = head;
strcpy(str,tmp->str); //Копирование значения из элемента
head = head->next; //Установка новой вершины стека
free(tmp); //Освобождение памяти
return 0; //Успешное завершение
}
Задача 9.5: Пользователь с клавиатуры построчно вводит целые числа. Признак завершения ввода - пустая строка. Сформировать из введенной последовательности бинарное дерево по следующему правилу: новое значение помещается в левую ветвь узла дерева, начиная с корневого, если оно больше значения в этом узле, в противном случае - в правую ветвь. В полученном дереве найти ветвь наибольшей длины и вывести значения узлов этой ветви на экран, начиная с корневого узла.