#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define allocPersons2(persons, size) \
{ \
persons = (struct person**)malloc((sizeof(struct person*) * size)); \
for (int i=0; i<size; i++) { \
persons[i] = NULL; \
} \
}
struct person
{
char surname[50];
unsigned int wiek;
struct person* descendants;
unsigned int descendantsCount
};
void allocPersons(struct person** persons, int size)
{
persons = (struct persons**)malloc((sizeof(struct persons*) * size));
for (int i=0; i<size; i++)
{
persons[i] = NULL;
}
}
void zrobPotomka(struct person** parent, unsigned int idx,int size)
{
parent[0]->descendantsCount = parent[0]->descendantsCount+1;// z polecenia wyniki ze potomkowie beda tylko dla indeksu 1 czyli 0
parent[0]->descendants = (struct persons**)malloc((sizeof(struct persons*) * size)); // tworze tablice struktur dla potomków o rozmiarze podanym przez użytkownika
struct person* descendant;
descendant = (struct person*)malloc(sizeof(struct person));
strcpy(descendant->surname , parent[0]->surname);//tu uproszczenie kopiowania nazwiska
descendant->wiek = parent[0]->wiek;//w końcu dopiero co utworzony ^^
freePersons(parent[idx]);
};
bool ifPersonDoesntExist( struct person** persons,int i )
{
if (persons[i] == NULL)
{
return true;
}
else
return false;
}
void printAPerson(int i, struct person* person)
{
printf("Person(%d): %s, wiek %d\n", i, person->surname, person->wiek);
}
void printPersons(struct person** persons, int num)
{
for (int i = 0; i < num; i++)
{
if (persons[i] == NULL)
{
continue;
}
printAPerson(i, persons[i]);
}
}
void createPersons(struct person** persons, int idx, const char surname[25], unsigned int wiek, int surnameLong)
{
persons[idx] = (struct person*)malloc(sizeof(struct person));
persons[idx]->wiek = wiek;
memcpy(persons[idx]->surname, surname, surnameLong);
}
void freePersons(struct person** persons, int num)
{
for (int i = 0; i < num; i++)
{
if (persons[i] == NULL)
{
continue;
}
free(persons[i]);
}
//teraz usun pamiec dla tablicy
free(persons);
}
int main()
{
struct person** persons;
char w;
char surname[100];
int age;
int size,i=0;
int idx,idxArray[size];
allocPersons(persons,size);
printf("podaj ile chcesz stworzyc osob");
scanf("%d", &size);
int tabOfIdx[size];
allocPersons2(persons,size);
while (i < size)
{
printf("podaj jaką opcje wybierasz \n");
printf("a --- utwórz strukture pod wybranym indeksem \n");
printf("p --- wypisz wszystkie dane z tablicy \n");
printf("c --- utworz potomkow na bazie osoby \n");
scanf("%c", &w);
switch (w)
{
case 'a':
printf("podaj indeks do utowrzenia osoby ");
scanf("%d", &idx);
idxArray[i]=idx;
if (ifPersonDoesntExist(persons,idx))
{
printf("podaj prosze nazwisko");
scanf("%s",&surname);
printf("podaj prosze oraz wiek");
scanf("%d",&age);
createPersons(persons, idx, surname, age, sizeof(surname)/sizeof(surname[0]));
i++;
}
else
printf("osoba o podanym indeksie istnieje");
break;
case 'c':
for (int k=0 ; k< sizeof(idxArray)/sizeof(idxArray[0]); k++)
{
if (ifPersonDoesntExist(persons,idx))
{
zrobPotomka(persons,k,size);
}
}
break;
case 'p':
for (int k=0 ; k< sizeof(idxArray)/sizeof(idxArray[0]); k++)
{
if (ifPersonDoesntExist(persons,idx))
{
printAPerson(idx,persons[i]);
}
}
break;
default:
printf("dowidzenia");
}
}
return 0;
}