Добавлен: 29.03.2023
Просмотров: 94
Скачиваний: 2
Введение
В языках программирования (Pascal, C, др.) существует способ выделения памяти под данные, который называется динамическим. В этом случае память под величины отводится во время выполнения программы. Такие величины будем называть динамическими. Раздел оперативной памяти, распределяемый статически, называется статической памятью; динамически распределяемый раздел памяти называется динамической памятью (динамически распределяемой памятью).
Использование динамических величин предоставляет программисту ряд дополнительных возможностей.
Во-первых, подключение динамической памяти позволяет увеличить объем обрабатываемых данных. Во-вторых, если потребность в каких-то данных отпала до окончания программы, то занятую ими память можно освободить для другой информации. В-третьих, использование динамической памяти позволяет создавать структуры данных переменного размера. Работа с динамическими величинами связана с использованием еще одного типа данных — ссылочного типа. Величины, имеющие ссылочный тип, называют указателями.
Предметом данного исследования являются динамические структуры данных в программировании.
Объектом исследования являются деревья в динамических структурах данных.
Цель данной курсовой работы - это изучить динамические структуры данных, а именно деревья.
Для достижения поставленной цели необходимо решить следующие задачи:
- рассмотреть понятие, сущность и необходимость динамических структур данных;
- изучить классификацию динамических структур данных;
- выявить динамические структуры данных, а именно деревья;
Данная работа состоит из введения, основной части, куда входят две главы, заключения, библиографического списка.
При написании данной работы использовался метод анализа научной литературы отечественных и зарубежных авторов, таких как Кернигана Б., Ритчи Д., Подбельского В. В., Фомина С. С., Будниковой Н.А., Хабибуллина И.Ш., Абилова К.С., Бабаева М.А., Галагузовой М.А. и др.
Глава 1. Теоретические аспекты динамических структур данных: деревья
Понятие, сущность и необходимость динамических структур данных
данных в в памяти не только их элементов, но и между .
При не учитывается самих . Такая структур, как их и характера элементами, к , что на этапе кода не выделить для в целом фиксированного , а не может с компонентами адреса.
Для адресации данных , называемый памяти, то под отдельные в момент, они " существовать" в программы, а не во . Компилятор в выделяет памяти для динамически , а не самого .
Динамические структуры – это данных, под выделяется и по необходимости.
данных тем что:
- она не имени; ей в процессе ;
- количество может не ;
- структуры в процессе ;
- в процессе может взаимосвязи структуры[1].
структуре статическая указатель (ее – этого ), которой к динамической . динамические не описания в , во время под них не выделяется. Во память под статические .
– это статические , они требуют . в динамических обычно в случаях.
, имеющие размер (, большой ), в одних и совершенно не в . В процессе нужен , или иная , которой в пределах и .
Когда , обрабатываемых в , объем . Динамические , по , характеризуются смежности в памяти, и размера ( ) структуры в ее . Поскольку структуры по адресам , элемента не может из адреса или элемента.
Для между структуры , через явные элементами. данных в связным. представления – в обеспечения структур:
1. ограничивается объемом ;
2. при изменении элементов не перемещение в , а только ;
3. большая [2].
Вместе с тем, не лишено и , из которых :
- на поля, для связывания с другом, память;
- к связной быть по времени[3].
является и именно им связного . Если в данных для любого нам во случаях номера и , содержащейся в , то для связного элемента не вычислен из .
Дескриптор содержит или указателей, в структуру, требуемого следованием по от элемента к . связное никогда не в , где логическая имеет вид или – с доступом по , но часто в , где логическая другой доступа (, , деревья и т.д.).
Порядок с динамическими следующий: ( место в ); работать при ; удалить ( структурой ).
1.2 динамических
Для того, в выполнения добавлять и , необходимо не в массив, а в . Если к добавить ещё и , в будет какого-то , то это и будет проблемы. представления и называется данных. динамических состоит из и одного или , ссылающихся на . Это позволяет в структуру или удалять из , не затрагивая при элементы [4].
того, позволяют нам так, чтобы их в было к тому, как эти в реальности. Так, для очереди к в лучше динамическая под названием «», а не массив, а для автомобильных вообще . нужна « ».
Динамические бывают и . В линейной данные в . К линейным списки (, , кольцевые), , (односторонние, , с приоритетами). структур . Нелинейные , как правило, в (каждый некоторое , например, в каждый ( ) имеет на и правый ).
Во задачах данные, у , размеры и меняться в программы. Для их динамические .
К таким :
- однонаправленные () ;
- двунаправленные () ;
- циклические ;
- ;
- дек;
- очередь;
- [5].
Они отличаются отдельных допустимыми .
структура несмежные памяти. широко и для эффективной с , размер , особенно для сортировки.
1.3 данных:
— это совокупность , узлами ( один из них как ), и отношений (), иерархическую . Узлы величинами или структурированного , за файлового. , не имеют ни узла, . Каждое следующими :
1. узел, в не ни одной ( );
2. в каждую , корня, дуга[6].
— это граф без . того, в одна , называется . Остальные по длине от дерева (см. рис. 1).
Рисунок 1 Динамическая структура данных: дерево
нами 1, зафиксируем X. Вершины, с X и расположенные нее от дерева, или сыновьями X. упорядочены . Вершины, у нет , называются . обычно , корнем .
в программировании чаще, чем . Так, на деревьев алгоритмы и .
Компиляторы в программы с уровня на представляют в виде , называются . естественно , где имеются структуры, т.е. , могут в друга. служить (см. рис. 2)
Рисунок 2 Динамическая структура данных-дерево (оглавление книги)
Представим, что из частей, — из , главы — из . книга дерева, из ребра к , частям .
В очередь, из книги к вершинам-главам, в эту , и так далее. компьютера представить в . Вершинам (их также или папками) и [7].
Из выходят к , соответствующим и файлам, в данном . представляются дерева. соответствует диска. , работу с , , как Norton в MS DOS или Проводник , изображать графически в .
Вершина в виде , ссылки на и на всех , а некоторую , зависящую от .
Объект, дерева, фиксированного , обычно в памяти. обычно , из смысла .
Так, очень бинарные , в число у вершины не . Если или сыновей у , то соответствующие нулевые . образом, у все ссылки на .
При работе с часто алгоритмы, т.е. , могут себя. При ему передается в ссылка на , которая как поддерева, из вершины. терминальная, т.е. у нее нет , то просто к вершине.
же у есть , то он вызывается для из сыновей. поддеревьев от алгоритма[8].
алгоритм, дерева. называется из всевозможных от дерева к . Под длиной число , в него, и последнюю .
, деревья к структур, строить в с использованием . важный тип - (бинарные) , в каждый самое два : левое и . , если вида (см. ), то ему соответствовать в структура (см. ).
Рисунок 3 Двоичное дерево и его представление с помощью списочных структур памяти а - двоичное дерево; б - представление дерева с помощью списков с использованием звеньев одинакового размера.
Для построения такого бинарного дерева используется следующий ссылочный тип:
type
T = Integer; { скрываем зависимость от конкретного типа данных }
TTree = ^TNode;
TNode = record
value: T;
Left, Right: TTree;
end;
Здесь поля Left и Right - это указатели на потомков данного узла, а поле value предназначено для хранения информации.
1.4 над деревьями
Для определены :
1. корня
2. узла в
3. по дереву
4.
5. удаление .
Для с деревьями алгоритмов. К относятся и обхода . в программе переменных: var t: ptr; s: ; c: ; b: boolean;
дерево с помощью процедуры:
procedure V (var t: ptr) var st: string begin readln (st) if st<>'. 'then begin new (t) t. info: =st V (t. Llink) V (t. Rlink) end else t: =nil end
отражается во данных: пустой условный (в случае ). Для на рис.3 имеет вид:
type
PNode = ^TNode;
TNode = record
Info : string; {поле данных}
Left,Right : PNode; {указатели на левое и правое поддеревья}
end;
Процедура создания нового узла.
{ Создание нового узла со значением информационного поля X.
Возвращается указатель на новый узел}
function NewNode(X:string):PNode;
var
P : PNode;
begin
New(P);
P^.Info := X;
P^.Left := Nil;
P^.Roght := Nil;
NewNode := P;
end;
три способа : в прямом , и концевом. может рекурсивной и без рекурсии ( )[9]. В приведенной процедуре дерева в .
Нерекурсивный дерева в :
program FactDemo;
var
k : integer;
function Factor(n:integer):integer;
begin
if n=0 then
Factor : 1
else
Factor := n * Factor(n-1);
{end if}
end;
begin
write(’Введите целое число ’);
readln(k);
if k>=0 then
writeln(’Факториал ’,n:1,’ = ’, Factor(k));
{end if}
end.
Пусть T - на дерево; А - , в заносятся еще не вершин; TOP - ; P - рабочая .
1. установка: TOP: =0; P: =T.
2. , то перейти на 4. { }
3. Вывести P. . заносим в : TOP: =+1; A [TOP]: =P; шаг по : P: =P. llink; на 2.
4. TOP=0, то .
5. вершину из : P: =A []; TOP: =TOP-1;
Шаг по : P: =P. rlink; на 2.
, деревом , или в виде , двоичное в слева от находятся с , меньшими из вершины, а - с элементами (, что все дерева и что их тип (ТЭД) операций )[10].
2. Реализация по с бинарными
2.1 программы
( упорядоченные, так и ) используются в . По причине мы в на рассмотрении с ними.
Для бинарного в введем тип, вид записи:
Type
PNode = ^TNode;
TNode = record
Data : integer; {информационное поле}
left,right : PNode;
end;
Процедура создания нового узла.
{ Создание нового узла со значением информационного поля X.
Возвращается указатель на новый узел}
function NewNode(X:string):PNode;
var
P : PNode;
begin
New(P);
P^.Info := X;
P^.Left := Nil;
P^.Roght := Nil;
NewNode := P;
end;
Процедура создания потомка (поддерева)
procedure SetLeft(P:PNode; X:string);
begin
P^.Left := NewNode(X);
end;
3. дерева:
- ( числа) с ;
- дубликаты не (но на экран);
- ввода числа 0;
- – упорядоченное .
При динамических «дерево» используются .
Рекурсия некоторого с самого .
При структур « » чаще рекурсивные .
предполагает понятия с этого . Вирт утверждение о «… мощность с тем, что она позволяет множество с конечного »[11].
рекурсивного факториал :
n! = 1 при n=0
n! = n*(n-1)! при n >0
В Турбо-Паскале рекурсия разрешена: подпрограмма может вызывать сама себя:
program FactDemo;
var
k : integer;
function Factor(n:integer):integer;
begin
if n=0 then
Factor : 1
else
Factor := n * Factor(n-1);
{end if}
end;
begin
write('Введите целое число ');
readln(k);
if k>=0 then
writeln('Факториал ',n:1,' = ', Factor(k));
{end if}
end.
Первое вычисляется, n=0, оно в соответствующий . Теперь на шаге членов -1) известны, и в это выражение , на предыдущем . Это в процессе .
Сформулируем два рекурсивных :
1. тривиального .
рекурсивный не создавать вызовов . Для этого он содержать : т.е. при некоторых вычисления в производиться без его .
Для функции «» случай:
2. сложного в более .
При входных выход за конечное вызовов. Для новый алгоритма более .
Иными алгоритм определение случая в простого .
Для «факториал» n! заменяется -1)!, и при этом с значение n , к нулю и его за число [12].
Из структуры « » видно, что она по , а в силу являются и все работы с . Для достаточно на выше бинарного .
В процедуре Add случай ( пустое) и
: добавить в и поддеревья – Add () и ).
Алгоритмы с
В приведенных предполагается, что ( ) дерева записью:
Type
PNode = ^TNode;
TNode = record
Data : integer; {информационное поле}