Автор работы: Пользователь скрыл имя, 21 Ноября 2011 в 12:32, курсовая работа
Язык Си, созданный Денисом Ритчи в начале 70-х годов в Bell Laboratory американской корпорации AT&T, является одним из универсальных языков программирования. Язык Си считается языком системного программирования, хотя он удобен и для написания прикладных программ.
ВВЕДЕНИЕ 3
1 ПОСТАНОВКА ЗАДАЧИ 4
1.1 Общая характеристика задачи 4
1.2 Двоичные деревья 5
Конструкторы и деструкторы 7
Поиск 7
Удаление элементов 9
2 РАЗРАБОТКА АЛГОРИТМА ЗАДАЧИ 13
2.1 Описание данных, используемых для решения задачи 13
2.2 Описание схемы программы 13
3 КОДИРОВАНИЕ ПРОГРАММЫ 14
3.1 Описание структуры разрабатываемого пакета 14
4 ТЕСТИРОВАНИЕ ПРОГРАММЫ 15
4.1 Внешний вид программы 15
ЗАКЛЮЧЕНИЕ 18
СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ: 19
ПРИЛОЖЕНИЕ А 20
СОДЕРЖАНИЕ
Язык
Си, созданный Денисом Ритчи в
начале 70-х годов в Bell Laboratory американской
корпорации AT&T, является одним из
универсальных языков программирования.
Язык Си считается языком системного программирования,
хотя он удобен и для написания прикладных
программ. Среди преимуществ языка Си
следует отметить переносимость программ
на компьютеры различной архитектуры
и из одной операционной системы в другую,
лаконичность записи алгоритмов, логическую
стройность программ, а также возможность
получить программный код, сравнимый по
скорости выполнения с программами, написанными
на языке ассемблера. Последнее связано
с тем, что хотя Си является языком высокого
уровня, имеющим полный набор конструкций
структурного программирования, он также
обладает набором низкоуровневых средств,
обеспечивающих доступ к аппаратным средствам
компьютера. С 1989 года язык Си регламентируется
стандартом Американского института национальных
стандартов ANSI С. В настоящее время, кроме
стандарта ANSI C разработан международный
стандарт ISO C (International Standard Organization C).
Работа со структурами
данных: программирование В дерева на языке С/С++
Автоматизированная информационная система на железнодорожном вокзале содержит сведения об отправлении поездов дальнего следования.
Для каждого поезда указывается:
• номер поезда;
• станция назначения;
время отправления.
Данные в информационной системе организованы в виде бинарного дерева.
Составить программу, которая:
• обеспечивает первоначальный ввод данных в информационную систему и формирование двоичного дерева;
• производит вывод всего дерева;
• вводит номер поезда и выводит все данные об этом поезде;
• вводит название станции назначения и выводит данные о всех поездах, следующих до этой станции.
Программа
должна обеспечивать диалог с помощью
меню и контроль ошибок при вводе.
Основные понятия
Структуры данных типа “дерево” исключительно широко используются в программной индустрии. В отличие от списковых структур деревья относятся к нелинейным структурам. Любое дерево состоит из элементов – узлов или вершин, которые по определенным правилам связаны друг с другом рёбрами. В списковых структурах за текущей вершиной (если она не последняя) всегда следует только одна вершина, тогда как в древовидных структурах таких вершин может быть несколько. Математически дерево рассматривается как частный случай графа, в котором отсутствуют замкнутые пути (циклы).
Дерево является типичным примером рекурсивно определённой структуры данных, поскольку оно определяется в терминах самого себя.
Рекурсивное определение дерева с базовым типом Т – это:
Отсюда видно, что в любом непустом дереве есть одна особая вершина – корень дерева, которая как бы определяет “начало” всего дерева. С другой стороны, существуют и вершины другого типа, не имеющие связанных с ними поддеревьев. Такие вершины называют терминальными или листьями.
Классификацию деревьев можно провести по разным признакам.
При использовании деревьев часто встречаются такие понятия как путь между начальной и конечной вершиной (последовательность проходимых ребер или вершин), высота дерева (наиболее длинный путь от корневой вершины к терминальным).
При рассмотрении дерева как структуры данных необходимо четко понимать следующие два момента:
Дерево
как абстрактная структура
Двоичные деревья
Двоичные деревья (ДД) используются наиболее часто и поэтому представляют наибольший практический интерес. Каждая вершина ДД должна иметь два связующих поля для адресации двух своих возможных потомков.
ДД
можно реализовать двумя
Второй
способ является значительно более
удобным и поэтому используется
наиболее часто. В этом случае каждая
вершина описывается как
struct
TREE {
int Info;
TREE *Right;
TREE *Left;
};
Для
обработки дерева достаточно знать
адрес корневой вершины. Для хранения
этого адреса надо ввести ссылочную
переменную:
TREE *Root;
Тогда
пустое дерево просто определяется установкой
переменной Root в нулевое значение:
Root = NULL;
Реализацию основных операций с ДД удобно начать с процедур обхода. Поскольку дерево является нелинейной структурой, то НЕ существует единственной схемы обхода дерева. Классически выделяют три основных схемы:
Для объяснения каждого из этих правил удобно воспользоваться простейшим ДД из трех вершин. Обход всего дерева следует проводить за счет последовательного выделения в дереве подобных простейших поддеревьев и применением к каждому из них соответствующего правила обхода. Выделение начинается с корневой вершины.
Сами
правила обхода носят рекурсивный
характер и формулируются следующим
образом:
В качестве примера по шагам рассмотрим обход следующего ДД с числовыми компонентами (10 вершин):
Обход в прямом порядке:
В итоге получаем следующий порядок обхода вершин: 0-1-3-4-6-7-2-5-8-9
Идеально сбалансированные деревья
В заключение данной темы рассмотрим один частный случай ДД – так называемое идеально сбалансированное дерево (ИСД). Как будет отмечено в дальнейшем, эффективное использование деревьев на практике часто требует управления ростом дерева для устранения крайних случаев, когда дерево вырождается в линейный список и тем самым теряет всю свою привлекательность (с вычислительной точки зрения, разумеется).
В этом смысле ИСД полностью оправдывает свое название, поскольку вершины в нем распределяются наиболее равномерно и тем самым ИСД имеет минимально возможную высоту. Более точно, ДД называется идеально сбалансированным, если для каждой вершины число вершин в левом и правом ее поддеревьях отличаются не более чем на единицу. Обратим внимание, что данное условие должно выполняться для всех вершин дерева!
ИСД легко строится, если заранее известно количество вершин N в этом дереве. В этом случае ИСД можно построить с помощью следующего рекурсивного алгоритма:
Естественно, что реализация рекурсивного алгоритма наиболее просто выполняется в виде рекурсивной подпрограммы. При этом между этой процедурой и процедурами обхода есть одно принципиальное различие: процедуры обхода лишь используют существующую структуру дерева, не изменяя ее, и поэтому их формальные параметры являются лишь входными, тогда как процедура построения ИСД должна СОЗДАВАТЬ вершины и каждый раз возвращать в вызвавшую ее подпрограмму адрес очередной созданной вершины. Поэтому формальный параметр ссылочного типа должен быть объявлен как параметр-переменная. Кроме того, второй формальный параметр-значение принимает число вершин в текущем строящемся поддереве.
void AddNodes
(Node **Сurrent, int aN);
{
Node *Tmp;
int NL, NR;
if (aN==0) /*вершин для размещения нет*/
Current = NULL; /*формируем пустую ссылку*/
else
{
NL = aN div 2; /*сколько вершин будет слева?*/
NR = aN – NL – 1; /*сколько вершин будет справа?*/
Tmp = new Node; /*создаем корень поддерева*/
AddNodes (&Tmp->Left, NL); /*уходим на создание
левого поддерева*/
AddNodes (&Tmp->Right, NR); /*уходим на создание
правого поддерева*/
Current = Tmp; /*возвращаем адрес созданного
корня*/
}
}
Информация о работе Программирование бинарных деревьев на языке СС++