Приклад виконання завдання
Паскаль
{Варіант 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].