- •Лекція 9. Динамічні структури об’єктів (дсо)
- •1. Зв’язана організація пам’яті. Асоціативні структури.
- •Типовими представниками лінійних списків є стеки і черги.
- •2 Основні операції над списками – це вставка, вилучення, сортування елементів. Незалежно від способу реалізації такі операції повинні виконуватися коректно, а саме:
- •Приклад 1. Операції зі стеками
Приклад 1. Операції зі стеками
#include <iostream.h>
#include <conio.h>
typedef struct StackData {
int Data;
StackData *Next;
} TStackData, *PStackData;
typedef class CStack {
private:
PStackData Top;
public:
CStack ( ) {Top = 0;};
~CStack( )
{
PStackData temp;
while (Top != 0) {
temp = Top->Next;
delete Top;
Top = temp; };
};
void Push(int);
int Pop(); // вилучає елемент зі стеку
int Count () ;
void Print();
} TStack, *PStack;
void CStack::Push(int Data){
PStackData temp = new TStackData;
temp->Data = Data;
temp->Next = Top;
Top = temp;
}
int CStack:: Pop (){ // повертає зі стеку
// самий верхній елемент
int Itemp=Top->Data;
PStackData Temp=Top;
Top=Top->Next;
delete Temp;
return Itemp;
}
int CStack::Count ()
{ int iCount=0;
PStackData temp = Top;
while (temp != 0) // рахуємо, поки temp!=0
{ iCount++; // і додаємо одиницю
temp=temp->Next ; } // і він тоді вказує на
// наступний елемент; рахуємо, +1 і на наступний
return iCount;
}
void CStack:: Print () // роздрукувати стек
{
PStackData PTmp = Top;
while (PTmp!=0)
{ cout << PTmp->Data << '\t' ; // t – крок
// табуляції, переміщає нас на t позицій
// вправо від заданої
PTmp=PTmp->Next; };
cout<<endl;
}
int main () {
PStack Stack = new TStack; // після цієї операції //відразу спрацьовує конструктор
Stack->Push (5); // Заганяємо в стек цифри
Stack->Push (4); // - || -
Stack->Push (3); // - || -
Stack->Print(); // роздрукуються 3 4 5
cout << "\n Count:"<< Stack->Count() << endl;;
cout << Stack->Pop() << endl; // потім видалиться 3?
Stack->Print () ; // і роздрукує 4 5
getch();
}
Приклад 2. Операції з чергами. #include <iostream.h>
#include <conio.h>
typedef struct QueData
{ int Data;
QueData *Next; }
TQueData, *PQueData; // ім’я перейменування,
// тип вказівників на структури
typedef class CQue {
private:
PQueData First, Last; // PQueData First –
// вказівник на 1-ий елемент, Last – на останній
public:
CQue() {First = Last = 0; }; // черга порожня,
// якщо так, тоді створюється один вказівник
~CQue () // first -> 1 | 0 <- last first=last
{ PQueData temp;
while (First != 0)
{ temp = First->Next;
delete First;
Fixst = temp; };
};
void Add(int);
double Average();
void Print();
} TQue, *PQue;
void CQue::Add(int Data) {
if (Last == 0)
{ First = Last = new TQueData;
First->Data = Data;
First->Next = 0; }
else
{ Last->Next = new TQueData;
Last = Last->Next;
Last->Data = Data;
Last->Next = 0; }
} ;
double CQue::Average() {
int iSum=0, iCount=0;
PQueData temp = First;
while (temp !=0)
{ iSum+=temp->Data;
temp=temp->Next ;
iCount++; };
return ((double)iSum)/iCount;
};
void CQue::Print(){
PQueData PTmp=First;
while (PTmp!=0)
{ cout<< PTmp->Data<<'\t';
PTmp=PTmp->Next; };
}
int main() {
PQue Que = new TQue;
Que->Add(5);
Que->Add(4);
Que->Add(3);
Que->Print();
cout << "\nSeredne:" << Que->Average();
getch(); }
Приклад 3. Двійкові дерева.
// файл btree.h
class BTREE // binary tree
{
int data;
BTREE *left, *right; public:
BTREE (int, BTREE* =0, BTREE* =0); ~BTREE(); friend BTREE* add(BTREE*,int); void print (); void printLVR(); void printRVL();
};
//файл btree.cpp #include <iostream.h>
#include "btree.h"
BTREE::BTREE(int newdata,BTREE *p_left, BTREE *p_right)
//створює нове дерево, ініціалізує його корінь та додає
//ліве і праве піддерева, які можуть бути порожніми
{
left=p_left;
right=p_right;
data=newdata;
}
BTREE::~BTREE()
{ if (left) delete left;
if (right) delete right; }
void BTREE::print() {
cout<<data;
if (left || right) cout <<'(';
if (left) left->print();
if (right)
{ cout<<',';
right->print(); }
if (left || right) cout<<')'; }
void BTREE::printLVR()
{ if (left) left->printLVR();
cout<<data<<',';
if (right) right->printLVR() ; }
void BTREE::printRVL()
{ if (right) right->printRVL() ;
cout<<data<<',';
if (left) left->printRVL() ; }
BTREE* add(BTREE* root,int newdata)
{ if (!root) root=new BTREE(newdata);
else
if (newdata<root->data)
root->left=add(root->left, newdata) ;
else root->right=add(root->right,newdata);
return root; }
void main()
{
int i; BTREE *p=0;
do {
cin>>i;
if (i) p=add(p,i);
}
while (i!=0);
p->print () ;
cout<<"\b \n"; p->printLVR();
cout<<"\b \n"; p->printRVL();
cout<<"\b \n";
}
15
23
7
21
50
0
15(7,23(21,50) .// дужковий
7,15,21,23,50 // L Root R
50,23,21,15,7 // R Root L