-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHeap.cpp
138 lines (118 loc) · 3.22 KB
/
Heap.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
//
// Created by Mateusz Śliwka on 2019-04-05.
//
#include "Heap.h"
#include <math.h>
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
Heap::Heap() {
Heap::array = NULL;
Heap::size = 0;
}
Heap::~Heap() {
if (Heap::size > 0)
delete[] array;
}
void Heap::clean() {
Heap::array = NULL;
Heap::size = 0;
}
void Heap::add(int value) {
//Wykluczamy mozliwosc zduplikowania wartosci w kopcu
if(!Heap::checkIfExist2(value)){
//Tworzenie nowej tablicy o wiekszym rozmiarze
int *newArray = new int[size + 1];
//Przepisanie danych do nowej tablicy
for (int i = 0; i < size; i++)
newArray[i] = array[i];
//Dodanie wartosci do kopca
newArray[size] = value;
//Usuniecie starej tablicy
delete[] array;
//Zastapienie starej nową
array = newArray;
//Przebudowanie na kopiec
Heap::rebuildHeap();
size++;}
}
void Heap::remove(int value) {
//Szukam w tablicy wartosci=valiue
for (int i = 0; i < size; i++) {
//Szukam wartosci ktora mam usunac
if (array[i] == value) {
int *newArray = new int[size - 1];
//Przepisanie danych do nowej tablicy z pominieciem tej znalezionej
for (int k = 0; k < i; k++) {
newArray[k] = array[k];
}
for (int k = i+1; k < size; k++) {
newArray[k-1] = array[k];
}
//Usuwam stara tablice
delete[] array;
//W miejsce starej wpisuje nowa, juz bez tego elementu
array = newArray;
//Zmniejszam rozmiar
size--;
//Przebudowuje na kopiec
Heap::rebuildHeap();
//Zakanczam petle
return;
}
}
}
bool Heap::checkIfExist(int value) {
//Przeszukuje cala tablice kopca
for (int i = 0; i < size; i++)
//Przyrownuje wartosc elementu do value
if (array[i] == value) {
cout << "Wartosc znajduje sie w tablicy kopca na pozycji: " << i<<endl;
//Jak znalazlem to zakanczam petle
return true;
}
cout << "Wartosc nie zostala znaleziona w kopcu." << endl;
return false;
}
bool Heap::checkIfExist2(int value) {
//Przeszukuje cala tablice kopca
for (int i = 0; i < size; i++)
//Przyrownuje wartosc elementu do value
if (array[i] == value) {
//Jak znalazlem to zakanczam petle
return true;
}
return false;
}
void Heap::rebuildHeap() {
int tmp = 0;
for (int i = size; 0 < i; i--) {
if (array[i - 1] < array[i]) {
tmp = array[i - 1];
array[i - 1] = array[i];
array[i] = tmp;
}
}
}
void Heap::printHeap() {
printBT("", "", 0);
}
void Heap::printBT(string sp, string sn, int v) {
string cr, cl, cp;
cr = cl = cp = " ";
cr = "┌─";
cl = "└─";
cp[0] = '|';
string s;
if (v < size) {
s = sp;
if (sn == cr) s[s.length() - 2] = ' ';
printBT(s + cp, cr, 2 * v + 2);
s = s.substr(0, sp.length() - 2);
cout << s << sn << array[v] << endl;
s = sp;
if (sn == cl) s[s.length() - 2] = ' ';
printBT(s + cp, cl, 2 * v + 1);
}
}