usaa25/a2/program.c
2025-11-25 11:02:17 +01:00

109 lines
2.7 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
struct osoba{
int vek;
};
// Počet prvkov v kope sa zväčší o jedna
void add_person(struct osoba** heap,int hsz, int vek ){
struct osoba* item = calloc(1,sizeof(struct osoba));
item->vek = vek;
// Uložíme na koniec
heap[hsz] = item;
// Pozrieme na jeho rodiča
int p = (hsz -1) / 2;
int i = hsz;
// Pokiaľ rodič existuje a jeho hodnota je väčšia
while(p >= 0 && heap[p]->vek > heap[i]->vek){
// Vymeníme ich hodnoty
struct osoba* this = heap[i];
heap[i] = heap[p];
heap[p] = this;
// Pokračujeme ďalším rodičom
i = p;
p = (p - 1) / 2;
}
}
void heapify(struct osoba** heap, int hsz,int i){
struct osoba* this = heap[i];
int left_index = (2*i) + 1;
int right_index = (2*i) + 2;
// Zistíme kde sa nachádza minimum
int m = i;
if (left_index < hsz && heap[left_index]->vek < this->vek){
m = left_index;
}
if (right_index < hsz && heap[right_index]->vek < this->vek){
m = right_index;
}
if (m != i){
heap[i] = heap[m];
heap[m] = this;
heapify(heap,hsz,m);
}
}
void print_heap_with_levels(struct osoba** heap, int size, int index, int depth){
if(index >= size || heap[index] == NULL){
return;
}
for(int i = 0; i<depth; i++){
printf(" ");
}
printf("%d\n", heap[index]->vek);
print_heap_with_levels(heap, size, 2*index+1, depth+1);
print_heap_with_levels(heap, size, 2*index+2, depth+1);
}
int main(){
struct osoba* pole[20];
memset(pole,0, sizeof(struct osoba*));
int pocet = 0;
char buff[20];
if(!fgets(buff, 20, stdin)){
printf("Chyba\n");
return 0;
}
buff[strcspn(buff, "\n")] = '\0';
char* token = strtok(buff, " ");
while (token)
{
char* endptr;
if(endptr == token){
printf("Nie je to kopa\n");
return 0;
}
int val = strtod(token, &endptr);
struct osoba* temp = malloc(sizeof(struct osoba));
temp->vek = val;
pole[pocet] = temp;
pocet++;
token = strtok(NULL, " ");}
int i = 0;
int l = i*2 +1;
int r = i*2 +2;
while (l< pocet && r<pocet && i<pocet)
{
if(pole[l]->vek <pole[i]->vek || pole[r]->vek <pole[i]->vek){
printf("Nie je kopa.\n");
return 0;
}
i++;
l = i*2 +1;
r = i*2 +2;
}
printf("Je to taka kopa:\n");
print_heap_with_levels(pole, pocet, 0, 0);
return 0;
}