Сложные структуры данных Стек Стеком называется структура данных, организованная по принципу LIFO – last-in, firstout , т.е. элемент, попавшим в множество последним, должен первым его покинуть. При практическом использовании часто налагается ограничение на длину стека, т.е. требуется, чтобы количество элементов не превосходило заранее определенное целое число N Стек Стек Реализация 1 на основе массива Для реализации стека, состоящего не более чем из 100 чисел, следует определить массив, состоящий из 100 элементов и целую переменную, указывающую на вершину стека (ее значение будет также равно текущему числу элементов в стеке) int stack[100], n=0; Стек Реализация 2 на основе массива с использованием общей структуры struct Stack{ int stack[100]; int n; }; Стек Реализация 3 на основе указателей Если максимальный размер стека можно выяснить только после компиляции программы, то память под стек нужно выделять динамически. При этом, вершину стека можно указывать не индексом в массиве, а указателем на вершину. Для этого следует определить следующие переменные int *stack, *head; или struct SStack{ int *stack; int *n; }; Очередь Очередью называется структура данных, организованная по принципу FIFO – firstin, first-out , т.е. элемент, попавшим в множество первым, должен первым его и покинуть. При практическом использовании часто налагается ограничение на длину очереди, т.е. требуется, чтобы количество элементов не превосходило заранее определенное целое число N Очередь Очередь реализация Для реализации очереди необходимо знать первый и последний элемент находящийся в ней. Например, для реализации стандартной очереди из менее чем 100 целых чисел определить следующие данные #define N 100 int array[N], begin=0,end=0; Соответственно при добавлении элементов в очередь переменная end будет увеличиваться, а при изъятии их из очереди увеличиваться будет begin. Бинарное дерево Бинарными деревьями называют структуру данных, в которой, как правило, задан корневой элемент или корень и для каждой вершины (элемента) существует не более двух потомков. Бинарное дерево реализация struct STree{ int value; struct STree *prev; struct STree *left, *right; }; здесь указатель prev указывает на родительский элемент данной вершины, а left и right – на двух потомков, которых традиционно называют левым и правым. Величина value называется ключом вершины. Бинарное дерево Бинарное дерево называется деревом поиска, если для любой вершины дерева a ключи всех вершин в правом поддереве больше или равны ключа a, а в левом – меньше. Неравенства можно заменить на строгие, если известно, что в дереве нет равных элементов. Дерево поиска Поиск элемента struct STree *Find(struct STree *root, int v){ if(root==NULL)return NULL; if(root->value==v)return root; if(root->value>=v)return Find(root->right,v); else return Find(root->left, v); }; Дерево поиска Добавление элемента struct STree *Insert(struct STree *root, struct STree *v){ if(v->value>=root->value) return root->right==NULL ? (v->prev=root, v->right=v->left=NULL, root->right=v) : Insert(root->right, v); else return root->left==NULL ? (v->prev=root,v->right=v->left=NULL,root->left=v) : Insert(root->left, v); }; Дерево поиска Дерево поиска if(v->value>=root->value) Дерево поиска return root->right==NULL ? Дерево поиска root->right==NULL ? (v->back=root,v->right=v->left=NULL,root->right=v) : Insert(root->right, v); Дерево поиска if(v->value>=root->value) Дерево поиска return root->left==NULL ? Дерево поиска root->left==NULL ? (v->prev=root,v->right=v->left=NULL,root->left=v) : Insert(root->left, v); Дерево поиска Добавление элемента Функция Insert добавляет элемент в бинарное дерево поиска и возвращает указатель на добавляемый элемент. Аргументы командной строки При запуске программы через консоль возможно передать в программу данные, называемые Аргументы командной строки, в виде строк. Они могут быть использованы во время работы программы Аргументы командной строки Обратиться к аргументам командной строки в программе возможно через специальные переменные int argc и char *argv[] argc – число переданных аргументов, argv – массив строк равный числу аргументов. При вызове программы всегда есть один аргумент имя запущенной программы. Аргументы командной строки #include <stdio.h> int main(int argc, char *argv[]){ if(argc > 1) { printf("Вы ввели много чего"); } printf("Но это точно имя этой программы: %s", argv[0]); return 0; } Аргументы командной строки