Учебное пособие Чебоксары 2008 удк 004. 657 П 36 icon

Учебное пособие Чебоксары 2008 удк 004. 657 П 36



Смотрите также:
1   2   3   4   5   6   7
^

Блок-схема алгоритма




Текст программы:

Очередь:

uses

crt;

const

n=10;

type

ct=^celltype;

celltype=record

element:byte;

next:ct;

end;

queue=record

front:ct;

rear:ct;


end;

var

s:queue;

x:byte;


procedure insert(var q:queue;x:byte);

begin

new(q.rear^.next);

q.rear:=q.rear^.next;

q.rear^.element:=x;

q.rear^.next:=nil;

end;

procedure create(var q:queue);

var

i,x:byte;

begin

new(q.front);

q.front^.next:=nil;

q.rear:=q.front;

for i:=1 to n do

begin

x:=round(random*100);

insert(q,x);

end;

writeln('QUEUE IS CREATE.');

end;


procedure delstart(var q:queue);

begin

q.front:=q.front^.next;

end;


function remove(var q:queue):byte;

begin

remove:=q.front^.next^.element;

delstart(q);

end;


procedure printqueue(var q:queue);

var

temp:queue;

begin

writeln('QUEUE:');

temp:=q;

while temp.front^.next<>nil do

begin

write(temp.front^.next^.element,' ');

temp.front:=temp.front^.next;

end;

writeln;

end;

procedure delqueue(var q:queue);

begin

while q.front^.next<>nil do delstart(q);

writeln('QUEUE IS DELETE.');

end;


begin

clrscr;

randomize;

create(s);

printqueue(s);

x:=remove(s);

writeln('X:=',x);

printqueue(s);

delqueue(s);

readkey;

end.

Стек:

uses

crt;

const

n=10;

type

ct=^celltype;

celltype=record

element:byte;

next:ct;

end;

stack=record

top:ct;

fin:ct;

end;

var

q:stack;

x:byte;


procedure push(var s:stack);

begin

new(s.fin^.next);

s.fin:=s.fin^.next;

s.fin^.element:=round(random*100);

s.fin^.next:=nil;

end;


procedure create(var s:stack);

var

i:byte;

begin

new(s.top);

s.top^.next:=nil;

s.fin:=s.top;

for i:=1 to n do push(s);

writeln('STACK IS CREATE.');

end;

procedure pop(var s:stack);

var

temp:stack;

begin

temp:=s;

while temp.top^.next<>s.fin do temp.top:=temp.top^.next;

s.fin:=temp.top;

end;


function stacktop(var s:stack):byte;

begin

stacktop:=s.top^.next^.element;

end;


procedure printstack(var s:stack);

var

temp:stack;

begin

writeln('STACK:');

temp:=s;

while temp.top^.next<>nil do

begin

write(temp.top^.next^.element,' ');

temp.top:=temp.top^.next;

end;

writeln;

end;


procedure delstack(var s:stack);

begin

s.top^.next:=nil;

writeln('STACK IS DELETE.');

end;


begin

clrscr;

randomize;

create(q);

printstack(q);

x:=stacktop(q);

writeln('TOP:=',x);

delstack(q);

readkey;

end.

Результаты расчетов

Для очереди S: 64,88,62,1,56,80,64,39,62,9 результат работы функции REMOVE(S) будет следующим: X=64, S: 88,62,1,56,80,64,39,62,9.


Для стека Q:

6,27,96,14,76,96,35,14,63,74 результат работы функции STACKTOP(Q) будет следующим: TOP=6.


^

Контрольные вопросы


  1. Дайте характеристику основных структур данных. В каких алгоритмах используются основные типы данных?

  2. Назовите отличительные особенности типа данных Массив, Запись и Множество. В чем их различия?

  3. Как реализуются динамические структуры данных? В чем их отличие от статических структур?

  4. В каких алгоритмах целесообразнее использовать динамические структуры данных?

  5. Назовите отличительные особенности типа данных Линейный список. Как реализуются алгоритмы, использующие линейные списки?

  6. Назовите отличительные особенности типа данных Циклический список. Как реализуются алгоритмы, использующие циклические списки?

  7. Для чего создаётся пользовательский тип данных Мультисписок?

  8. Как представить стек и очередь в виде списков?

  9. Какие особенности у алгоритмов, использующих тип данных Стек?

  10. Какие особенности у алгоритмов, использующих тип данных Очередь?
^

Лабораторная работа 2.

Бинарные деревья


Цель работы: 1) ознакомиться со способами представления деревьев и методами их прохождения; 2) получить практические навыки в программировании задач с использованием деревьев.
^

Необходимые исходные сведения


В повседневной жизни мы очень часто встречаем примеры деревьев. Например, люди часто используют генеалогическое дерево для изображения структуры своего рода.

Второй пример – это структура большой организации; использование древообразной структуры для представления ее "иерархического строения" ныне широко используется во многих компьютерных задачах.

Третий пример – это грамматическое дерево; изначально оно служило для грамматического анализа компьютерных программ, а ныне широко используется и для грамматического анализа литературного языка.

Мы начнем изучение деревьев с того, что определим их как некий абстрактный объект и введем всю связанную с ними терминологию.

Самыми простыми из деревьев считаются бинарные деревья.

Бинарное дерево – это конечное множество элементов, которое либо пусто, либо содержит один элемент, называемый корнем дерева, а остальные элементы множества делятся на два непересекающихся подмножества, каждое из которых само является бинарным деревом.

Эти подмножества называются левым и правым поддеревьями исходного дерева.

Каждый элемент бинарного дерева называется узлом дерева.

Два узла являются братьями, если они сыновья одного и того же отца.

Если каждый узел бинарного дерева, не являющийся листом, имеет непустые правые и левые поддеревья, то дерево называется строго бинарным деревом.

Свойство. Строго бинарное дерево с n листами всегда содержит 2n – 1 узлов.

Уровень узла в бинарном дереве может быть определен следующим образом. Корень дерева имеет уровень 0, и уровень любого другого узла дерева имеет уровень на 1 больше уровня своего отца.

Глубина бинарного дерева – это максимальный уровень листа дерева, что равно длине самого длинного пути от корня к листу дерева. Полное бинарное дерево уровня n – это дерево, в котором каждый узел уровня n является листом и каждый узел уровня меньше n имеет непустые левое и правое поддеревья.

Почти полное бинарное дерево – это бинарное дерево, для которого существует неотрицательное целое k, такое, что

  1. каждый лист в дереве имеет уровень k или k+1;

  2. если узел дерева имеет правого потомка уровня k+1, тогда все его левые потомки, являющиеся листами, также имеют уровень k+1.

Узлы почти полного бинарного дерева могут быть пронумерованы так, что корню назначается номер 1, левому сыну - удвоенный номер его отца, а правому – удвоенный номер отца плюс единица (намного проще это понять, если представить эти числа в двоичной системе).

Есть еще одна разновидность бинарных деревьев, которая называется «упорядоченные бинарные деревья».

Упорядоченные бинарные деревья – это деревья, в которых для каждого узла Х выполняется правило: в левом поддереве - ключи, меньшие Х, в правом поддереве – большие или равные Х. Структура бинарного дерева построена из узлов. Узел дерева содержит поле данных и два поля с указателями.

Поля указателей называются левым указателем и правым указателем, поскольку они указывают на левое и правое поддерево соответственно. Значение nil является признаком пустого дерева (рисунок).

Над бинарным деревом есть операция его прохождение, т.е. нужно обойти все дерево, отметив каждый узел один раз.

Существует три способа обхода бинарного дерева.

В прямом порядке:

а) попасть в корень;

б) пройти в прямом порядке левое поддерево;

в) пройти в прямом порядке правое поддерево.

В симметричном порядке:

а) пройти в симметричном порядке левое поддерево;

б) попасть в корень;

в) пройти в симметричном порядке правое поддерево.

В обратном порядке:

а) пройти в обратном порядке левое поддерево;

б) пройти в обратном порядке правое поддерево;

в) попасть в корень.

^ Варианты заданий

Вариант
Задание

1

Написать программы вычисления высоты дерева с использованием пред­ставлений деревьев.

2

Написать программу, выводящую списки узлов дерева, при обходе этого дерева в прямом порядке.

3

Написать программы обхода двоичных деревьев в прямом порядке.

4

Написать программу поиска элементов, кратных 2, в бинарном дереве.

5

Написать программу поиска положительных элементов в бинарном дереве.

6

Написать программу, выводящую списки узлов дерева, при обходе этого дерева в внутреннем порядке.

7

Написать программы обхода двоичных деревьев в обратном порядке.

8

Написать программы обхода двоичных деревьев в внутреннем порядке.

9

Написать программу, выводящую списки узлов дерева, при обходе этого дерева в обратном порядке.

10

При прохождении дерева в порядке уровней, в список узлов сначала заносится корень дерева, затем все узлы глубины 1, далее все узлы глубины 2 и т.д. Уз­лы одной глубины заносятся в список узлов в порядке слева направо. Напи­сать программу обхода деревьев в порядке уровней.

^ Пример выполнения

Задание: разработать программу, реализующую прямое прохождение (известное также как прохождение в глубину) бинарного дерева.

Блок-схема алгоритма



Текст программы:

uses

crt;

const

nvertex=100;

nadj=1000;

var

f:text;

n,nt:integer;

adj:array [1..nadj] of integer;

fst:array [1..nvertex] of integer;

nbr:array [1..nvertex] of integer;

vtx:array [1..nvertex] of integer;

mark:array [1..nvertex] of integer;

t:array [1..nvertex] of integer;

b:array [1..nvertex] of integer;


procedure init(var y:boolean);

var

i,j,m:integer;

begin

for i:=1 to n do

for j:=1 to nbr[i] do

begin

y:=false;

for m:=1 to n do if adj[fst[i]+j]=vtx[m] then

begin

y:=true;

adj[fst[i]+j]:=m;

break;

end;

if not y then exit;

end;

end;


procedure deep(x,u:integer;var c:integer);

var

i,v:integer;

begin

c:=c+1;

mark[x]:=c;

for i:=1 to nbr[x] do

begin

v:=adj[fst[x]+i];

if mark[v]=0 then

begin

nt:=nt+2;

t[nt-1]:=x;

t[nt]:=v;

b[nt div 2]:=1;

deep(v,x,c);

end;

else if (mark[v]u) then

begin

nt:=nt+2;

t[nt-1]:=x;

t[nt]:=v;

b[nt div 2]:=0;

end;

end;

end;


procedure way;

var

v,c:integer;

begin

nt:=0;

c:=0;

for v:=1 to n do mark[v]:=0;

for v:=1 to n do if mark[v]=0 then deep(v,0,c);

end;


procedure main;

var

i,j:integer;

y:boolean;

begin

writeln('Reading...');

assign(f,'in.txt');

reset(f);

read(f,n);

fst[1]:=0;

for i:=1 to n do

begin

read(f,vtx[i]);

read(f,nbr[i]);

for j:=1 to nbr[i] do read(f,adj[fst[i]+j]);

fst[i+1]:=fst[i]+nbr[i];

end;

close(f);

writeln('Solve...');

assign(f,'out.txt');

rewrite(f);

init(y);

if not y then

begin

writeln(f,'BAD SEED! Hi from hell');

writeln('BAD SEED! Hi from hell');

close(f);

exit;

end;

way;

for i:=1 to nt div 2 do write(f,vtx[t[2*i-1]]:3);

writeln(f);

for i:=1 to nt div 2 do write(f,vtx[t[2*i]]:3);

writeln(f);

for i:=1 to nt div 2 do write(f,b[i]:3);

writeln(f);

close(f);

writeln('End.');

writeln('Press any key.');

end;

begin

clrscr;

main;

readkey;

end.
^

Результаты расчетов


Структура входного файла IN.TXT:

19

1 3 2 3 4

2 3 1 5 6

3 2 1 7

4 4 1 8 9 10

5 2 2 11

6 1 2

7 3 3 12 13

8 1 4

9 3 4 14 15

10 1 4

11 3 5 16 17

12 1 7

13 1 7

14 1 9

15 3 9 18 19

16 1 11

17 1 11

18 1 15

19 1 15

Структура выходного файла OUT.TXT:

1 2 5 11 11 2 1 3 7 7 1 4 4 9 9 15 15 4

2 5 11 16 17 6 3 7 12 13 4 8 9 14 15 18 19 10

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1




страница5/7
Дата конвертации17.11.2013
Размер1,66 Mb.
ТипУчебное пособие
1   2   3   4   5   6   7
Разместите кнопку на своём сайте или блоге:
rud.exdat.com


База данных защищена авторским правом ©exdat 2000-2012
При копировании материала укажите ссылку
обратиться к администрации
Документы