Evo resenja za 2 zadatak, pa ces lako naci resenje sad za prvi :)
Samo, s obzirom da je ovo stablo, ono mora da se sortira po nekom redosledu, tako da je ovo stablo sortirano po prezimenu, a valjda ako hoces kako unosis tako i da ispisuje, onda se koriste liste, a mozda i ne, davno sam ovo radio (ima 3 meseca od ispita :))
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 40
typedef struct cvor {
char ime[MAX];
char prezime[MAX];
int pojavljivanja;
struct cvor *l, *d;
} CVOR;
/* Funkcija kreira novi cvor koji sadrzi datu rec. */
CVOR* napravi_cvor(char a[],char b[]){
CVOR *novi = (CVOR*)malloc(sizeof(CVOR));
if (novi == NULL){
fprintf(stderr,"Neuspela alokacija.\n");
exit(1);
}
strcpy(novi->ime, a);
strcpy(novi->prezime,b);
novi->pojavljivanja = 1;
novi->l = NULL;
novi->d = NULL;
return novi;
}
/* Funkcija ubacuje rec u drvo po prezimenu. */
CVOR* ubaci_u_drvo(CVOR *drvo, char a[],char b[]){
if (drvo == NULL)
return napravi_cvor(a,b);
if (strcmp(b, drvo->prezime) < 0)
drvo->l = ubaci_u_drvo(drvo->l,a,b);
else if (strcmp(b, drvo->prezime) > 0)
drvo->d = ubaci_u_drvo(drvo->d,a,b);
// Prezime se vec nalazi u drvetu pa se povecava broj pojavljivanja
else
drvo->pojavljivanja++;
return drvo;
}
/* Funkcija ispisuje drvo na ekran. */
void ispisi_drvo(CVOR *drvo){
if (drvo != NULL){
ispisi_drvo(drvo->l);
printf("%s : %d \n",drvo->prezime, drvo->pojavljivanja);
ispisi_drvo(drvo->d);
}
}
/* Funkcija dealocira dinamicki alocirano drvo. */
void obrisi_drvo(CVOR *drvo){
if (drvo != NULL){
obrisi_drvo(drvo->l);
obrisi_drvo(drvo->d);
free(drvo);
}
}
int main(int argc, char **argv){
CVOR *drvo = NULL;
char a[MAX];
char b[MAX];
while (scanf("%s%s",a,b) == 2){
drvo = ubaci_u_drvo(drvo,a,b);
}
ispisi_drvo(drvo);
putchar('\n');
obrisi_drvo(drvo);
return 0;
}
EDIT: sad primetih da su charovi ograniceni na 100, samo izmeni to u kodu...
Leonardo da Vinči
Nema istine u onim naukama u kojima se matematika ne primenjuje.
Milorad Stevanović
Bog postoji zato sto je matematika neprotivurečna.