Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна_робота_АТД.doc
Скачиваний:
2
Добавлен:
20.07.2019
Размер:
111.62 Кб
Скачать

Приклад виконання завдання

Паскаль

{Варіант 15}

program lab_12;

const

N = 10;

type

{опис покажчика на абстрактний тип даних «чергу»}

pQueue = ^Queue;

{опис процедурного типу з двома параметрами типів pQueue та integer}

pfnInsert = procedure (TempQueue : pQueue; value : integer);

{опис процедурного типу }

pfnDelete = function (TempQueue : pQueue) : integer;

{опис абстрактного типу даних – черги (зв’язане представлення)}

Queue = record

mas : array [1..N] of integer;

handle : integer;

{опису покажчика на підпрограму, який має тип pfnInsert }

pfn1 : pfnInsert;

{опису покажчика на підпрограму, який має тип pfnDelete }

pfn2 : pfnDelete;

end;

{опис процедури для запису одного значення до черги}

procedure Insert (TempQueue : pQueue; value : integer);far;

begin

{перевірка значення вказівника на поточний елемент черги. Якщо він менше} {за загальну кількість елементів у черзі, то нове значення записується у кінець} {черги}

if TempQueue^.handle < N then

begin

TempQueue^.handle := TempQueue^.handle + 1;

TempQueue^.mas [TempQueue^.handle] := value

end;

end;

{опис функції читання одного значення з черги}

function Delete (TempQueue : pQueue) : integer;far;

const

{опис змінної, в яку зчитується значення з черги}

del : integer = 0;

var

i : integer;

begin

{перевірка значення вказівника на поточний елемент черги. Якщо він більш за} {0,у черзі є елементи}

if TempQueue^.handle > 0 then

begin

{читання елемента, який стоїть на початку черги}

del := TempQueue^.mas[1];

i := 1;

{організація циклу, в якому елементи пересуваються на один до початку черги}

while i < TempQueue^.handle do

begin

TempQueue^.mas [i] := TempQueue^.mas [i + 1];

i := i + 1

end;

{онулуння елемент, який стає після пересування вільним }

TempQueue^.mas [TempQueue^.handle] := 0;

{зменшення на один кількості елементів у черзі}

TempQueue^.handle := TempQueue^.handle - 1

end;

{повернення з функції значення, яке прочитали}

Delete := del;

end;

{основна програма}

var

{опис покажчика на структуру даних чергу}

myQueue : pQueue;

n_del_el, i, res : integer;

begin

{розподіл місця у купі для черги}

new (myQueue);

{онулуння покажчика на поточну позицію елемента черги}

myQueue^.handle := 0;

{ініціалізація покажчика pfn1 типу pfnInsert процедурою Insert }

myQueue^.pfn1 := Insert;

{ініціалізація покажчика pfn2 типу pfnDelete функцією Delete}

myQueue^.pfn2 := Delete;

n_del_el := 6;

{організація циклу, в якому до черги записуються N елементів }

for i := 1 to N do

myQueue^.pfn1 (myQueue, i + 10);

{організація циклу, в якому з черги видаляються n_del_el елементів }

while n_del_el > 0 do

begin

res := myQueue^.pfn2(myQueue);

n_del_el := n_del_el - 1;

end;

{звільнення місця у купі}

dispose (myQueue);

end.

\\Сі

//опис елемента структури даних «дерево», який складається зі значення елемента data та покажчиків на ліву і праву гілку дерева

struct node

{ float data;

node* left;

node* right;

};

//опис абстрактного типу даних «дерево», який складається з покажчика на //корінь дерева, покажчика pfnInsert на підпрограму для запису одного

//значення у дерево та покажчика pfnTraversal на підпрограму обходу дерева

struct tree

{ node* root;

tree* (*pfnInsert) (tree*, float);

void (*pfnTraversal) (tree*, float[]);

};

//опис підпрограми запису одного значення у дерево

tree* Insert (tree* pTree, float d)

{

node* NewNode, *CurNode;

bool flag;

//опис нового вузла та розподіл для нього пам’яті у купі

NewNode = new node;

//ініціалізація полів нового вузла

NewNode ->data = d;

NewNode ->left = 0;

NewNode ->right = 0;

//перевірка покажчика на корінь дерева

if (pTree ->root == 0)

//якщо покажчик дорівнює 0, то новий вузол розташовується у корні

pTree ->root = NewNode;

//визначення місця розташування у дереві нового вузла

else {

//ініціалізація покажчика на поточний елемент покажчиком на корінь дерева

CurNode = pTree ->root;

//прапор буде показувати, що новий вузол зайняв місце у дереві

flag = false;

//організація циклу для пошуку місця розташування нового вузлу

while (!flag) {

//порівняння даних елементів поточного та нового вузлів

if (CurNode ->data >= NewNode ->data)

//розміщення нового вузла як лівого нащадка поточного, якщо значення

// поточного вузла не менше значення нового

if (CurNode ->left == 0) {

flag = true;

CurNode ->left = NewNode;

}

else CurNode = CurNode ->left;

//розміщення нового вузла як правого нащадка поточного в іншому випадку

else

if (CurNode ->right == 0) {

flag = true;

CurNode ->right = NewNode;

}

else CurNode = CurNode ->right;

}

}

return pTree;

}

//

void OneNode (node* cur, float mas [], int& i)

{

if (cur != 0) {

OneNode (cur ->left, mas, i);

mas [i] = cur ->data;

i++;

OneNode (cur ->right, mas, i);

}

}

//

void Traversal (tree* pTree, float mas[])

{

node* CurNode = pTree ->root;

int i = 0;

OneNode (CurNode, mas, i);

}

void main()

{

const int N = 10;

float Mas [N] = {12.23, -678,54, 8.0785, 7.33, 0.129, 543.09, 32.55, -994.01, 207.4};

float MasTrav[N];

int i;

tree* MyTree = new tree;

MyTree ->root = 0;

MyTree ->pfnInsert = Insert;

MyTree ->pfnTraversal = Traversal;

for (i = 0; i < N; i++)

MyTree = MyTree ->pfnInsert(MyTree, Mas[i]);

MyTree ->pfnTraversal(MyTree, MasTrav);

delete MyTree;

}

Література: [1]; [2]; [4]; [5]; [6]; [7].