drzewo BST #include <stdio.h> #include <conio.h> #include <stdlib.h> #include "BST.h" #include "uni.h" Funkcje pomocnicze #ifndef UNI #define UNI #include <stdio.h> #include <conio.h> #include <stdlib.h> DEKLARACJE innych funkcji Funkcja zabezpiecza przed zamknięciem okna programu void koniec(); Funkcja max zwracająca maximum int max(int, int ); C 14 plik : program.h PROGRAM GŁÓWNY int main(){ struct W * n, *z; n=czytaj_tree("pr_01.txt"); printf("ntd R Z E W O nnnn"); druk_tree(n,0); printf("nnnglebokosc n=%dnnn",deep_tree(n)); printf("ntd R Z E W O znnn"); z=kopia_tree(n); druk_tree(z,0); printf("nnnglebokosc z=%dnnn",deep_tree(z)); zapisz_tree(z,"drzewo.txt","td R Z E W O Znn"); koniec(); return 0; plik : uni.h Funkcja min zwracająca minimum int min(int, int ); Funkcja dopisująca wartość double do pliku void dopisz_lf(char *, double ); Funkcja dopisująca znak do pliku void dopisz_c(char *, char ); Funkcja dopisująca napis do pliku void dopisz_s(char *, char* ); #include "uni.c" #endif plik : BST.h
C 14 drzewo BST #ifndef BST #define BST #include <stdio.h> #include <conio.h> #include <stdlib.h> STRUKTURA W każdy obiekt typu struct W jest węzłem drzewa BST l wskazuje na lewe poddrzewo p wskazuje na prawe poddrzewo n przechowuje wartość d przechowuje liczbe wszystkich potomków danego węzła struct W{ int d; double n; struct W * l; struct W * p; ; Deklaracje funkcji dla struktury W Funkcja n_w tworzy nowy węzeł i zwraca do niego wskaźnik struct W * n_w(double); Funkcja druk_w drukuje na ekran zawartość węzła pokazywanego przez wskaźnik void druk_w(struct W * ); Funkcja dodaj_w wstawia węzeł o zadanej wartości do drzewa pokazywanego przez wskaźnik void dodaj_w(struct W *, double); Funkcja drukująca drzewo w porządku in-order void druk_in(struct W *); Funkcja zwracająca głębokość drzewa int deep_tree(struct W *); Funkcja drukująca drzewo bokiem void druk_tree(struct W *,int ); Funkcja czytająca drzewo z pliku struct W * czytaj_tree(char * ); Funkcja tworząca kopię drzewa struct W * kopia_tree(struct W *); Funkcja zapisująca drzewo do pliku void zapisuj_tree(struct W *,int,char *); Funkcja zapisująca drzewo do pliku void zapisz_tree(struct W *,char *, char *); #include "BST.c" #endif
C 14 Funkcje pomocnicze- definicje funkcji Funkcja koniec zabezpiecza przed przedwczesnym zamknięciem okna programu void koniec(){ printf("nk O N I E C"); fflush(stdin); getch(); Funkcja max zwracająca maximum z x i y int max(int x, int y){ if(x>y) return x; return y; Funkcja min zwracająca minimum z x i y int min(int x, int y){ if(x<y) return x; return y; plik : uni.c Funkcja dopisująca wartość double do pliku void dopisz_lf(char *nazwa, double x){ FILE *plik; plik=fopen(nazwa,"a"); fprintf(plik,"%.0lfn",x); fclose(plik); Funkcja dopisująca znak do pliku void dopisz_c(char *nazwa, char x){ FILE *plik; plik=fopen(nazwa,"a"); fprintf(plik,"%c",x); fclose(plik); Funkcja dopisująca napis do pliku void dopisz_s(char *nazwa, char* x){ FILE *plik; plik=fopen(nazwa,"a"); fprintf(plik,"%s",x); fclose(plik);
drzewo BST #include "uni.h" FUNKCJE dla struktury W Funkcja n_w tworzy nowy węzeł i zwraca do niego wskaźnik struct W * n_w(double p){ struct W *pm; pm=malloc(sizeof(struct W)); pm->l=null; pm->p=null; pm->n=p; pm->d=0; return pm; Funkcja druk_w drukuje na ekran zawartość węzła pokazywanego przez wskaźnik p void druk_w(struct W * p){ printf("n=%.2lfn",p->n); printf("d=%dn",p->d); C 14 plik : BST.c Funkcja dodaj_w wstawia węzeł o wartości t do drzewa pokazywanego przez wskaźnik x void dodaj_w(struct W * t, double x){ struct W* pom; i=1; pom=t; while((pom->l!=null pom->p!=null) && i!=0) { i=0; if(pom->n>x && pom->l!=null) { pom=pom->l; i++; if(pom->n<=x && pom->p!=null) { pom=pom->p; i++; if(pom->n>x && pom->l==null) pom->l=n_w(x); if(pom->n<=x && pom->p==null) pom->p=n_w(x);
Funkcja drukująca drzewo w porządku in-order void druk_in(struct W * p){ if(p->l!=null) druk_in(p->l); printf("n= %.2lftd=%dn",p->n,p->d); if(p->p!=null) druk_in(p->p); C 14 Funkcja zwracająca głębokość drzewa int deep_tree(struct W * t){ i=1; if(t->l!=null && t->p!=null) i=i+max(deep_tree(t->l),deep_tree(t->p)); else { if(t->p!=null) i=i+deep_tree(t->p); if(t->l!=null) i=i+deep_tree(t->l); if(t->l==null && t->p==null) i=1; return i; Funkcja drukująca drzewo bokiem void druk_tree(struct W *t,int k){ if(t!=null) { for(i=1;i<=k;i++) if(!(k%2)) k+=3; druk_tree(t->p,k+5); if(t->p!=null) { for(i=0;i<(k+2);i++) printf(" "); printf(" n"); for(i=0;i<k;i++) printf(" "); printf("%.0lfn",t->n); if(t->l!=null) { for(i=0;i<(k+2);i++) printf(" "); printf(" n"); druk_tree(t->l,k+5);
C 14 Funkcja czytająca drzewo z pliku struct W * czytaj_tree(char * nazwa){ struct W *pm; double pn; FILE *plik; pm=null; plik=fopen(nazwa,"r"); if(plik!=null) { i=fscanf(plik,"%lf",&pn); if(i!=-1) pm=n_w(pn); while(i!=-1) { i=fscanf(plik,"%lf",&pn); if(i!=-1) dodaj_w(pm,pn); else printf("nbrak PLIKU %sn",nazwa); return pm; Funkcja zapisująca drzewo do pliku void zapisuj_tree(struct W *t,int k,char *n){ if(t!=null) { for(i=1;i<=k;i++) if(!(k%2)) k+=3; zapisuj_tree(t->p,k+5,n); if(t->p!=null) { for(i=0;i<(k+2);i++) dopisz_c(n,' '); dopisz_s(n," n"); for(i=0;i<k;i++) dopisz_c(n,' '); dopisz_lf(n,t->n); if(t->l!=null) { for(i=0;i<(k+2);i++) dopisz_c(n,' '); dopisz_s(n," n"); zapisuj_tree(t->l,k+5,n); Funkcja zapisująca drzewo do pliku void zapisz_tree(struct W *t,char *n, char *tekst){ FILE * plik; plik=fopen(n,"w"); fprintf(plik,"%s",tekst); fclose(plik); zapisuj_tree(t,0,n);
Funkcja tworząca kopię drzewa struct W * kopia_tree(struct W *t){ struct W * pp; pp=n_w(t->n); if(t->p!=null) pp->p=kopia_tree(t->p); if(t->l!=null ) pp->l=kopia_tree(t->l); return pp; D R Z E W O n C 14 64 128 32 256 96 48 512 150 72 20 16 10 glebokosc n=6 K O N I E C 600 712
C 14