All pastes #503083 Raw Edit

Something

public c v1 · immutable
·published 2007-05-22 18:53 UTC
rendered paste body
#include <stdio.h>#include <stdlib.h>#include <math.h>#include <string.h>typedef struct uzol{	int x;	struct uzol *r;	struct uzol *l;	int hladina;	struct uzol *dalsi;	char fikt;}UZOL;UZOL *koren=0, *zac_fronty=0, *kon_fronty=0;int max_hladina=0;void pridaj(UZOL **koren, int i){	UZOL *akt;	while(*koren && (*koren)->x !=i)	{		if((*koren)->x >i) koren=&(*koren)->l;		else koren=&(*koren)->r;	}	if(!*koren)	{		akt=(UZOL *) malloc(sizeof(UZOL));		akt->x=i;		akt->l=0;		akt->r=0;		*koren=akt;	}	return;}void do_fronty(UZOL *akt, int f, int uroven){	UZOL *pom=akt;	if(!f) 	{		pom=(UZOL *) malloc(sizeof(UZOL));		pom->fikt='f';		pom->l=0;		pom->r=0;		pom->hladina=uroven;	}	else 	{		pom->fikt='s';	}	if(!kon_fronty) zac_fronty=pom;	if(kon_fronty) kon_fronty->dalsi=pom;	pom->dalsi=0;	kon_fronty=pom;	}UZOL *z_fronty(void){	UZOL *pom=zac_fronty;	if(!zac_fronty->dalsi) kon_fronty=0;	zac_fronty=zac_fronty->dalsi;	return pom;}void hlbka(UZOL *koren, int uroven){	if(!koren) return;	if((uroven+1) > max_hladina) max_hladina=uroven+1;	koren->hladina=uroven+1;	hlbka(koren->l, uroven+1);	hlbka(koren->r, uroven+1);}#define TERM_WIDTH 64void vypis_cislo(int level, int cislo, int *nevojde_sa){	int pom=TERM_WIDTH/(1<<(level-1));	int sirka_cisla=1, mezer_vpravo,mezer_vlevo,l,r;	if(cislo!=0) sirka_cisla=ceilf(log10f(abs(cislo)));	if(cislo<0) ++sirka_cisla;	mezer_vlevo=pom-sirka_cisla;	mezer_vlevo/=2;	mezer_vpravo=pom-mezer_vlevo-sirka_cisla;	for(;mezer_vlevo>0;--mezer_vlevo) printf(" ");	if(sirka_cisla>pom)	{		*nevojde_sa=1;		l=(sirka_cisla-1)/2;		r=sirka_cisla-l-1;		for(;l>0;--l) printf(" ");		printf("x");		for(;r>0;--r) printf(" ");	}	else printf("%d",cislo);	for(;mezer_vpravo>0;--mezer_vpravo) printf(" ");}void vypis_fiktivni_uzel(int level){	int i=TERM_WIDTH/(1<<(level-1));	for(;i;--i) printf(" ");}void vypis_graficky(UZOL *koren){	UZOL *akt;	int level=0, nevojde_sa=0;		if(!koren) return;	zac_fronty=kon_fronty=0;	do_fronty(koren,1,1);	while((akt=z_fronty()) && ((akt->hladina)<=(max_hladina)) && level<=7)	{		if(akt->l) do_fronty(akt->l,1,(akt->hladina)+1);				else do_fronty(0,0,(akt->hladina)+1);		if(akt->r) do_fronty(akt->r,1,(akt->hladina)+1);				else do_fronty(0,0,(akt->hladina)+1);				if(akt->hladina>level) 		{			printf("\n\n\n");			++level;		}		if(akt->fikt=='s')			vypis_cislo(level,akt->x,&nevojde_sa);		else			vypis_fiktivni_uzel(level);	}	if(level>7) printf("sori, osmu a dalsie hladiny uz nejde zobrazit");	if(nevojde_sa) printf("\n[niektore cisla pre svoju velkost nemohli byt zobrazene,\n\tpreto sa na ich pozicii vyskytuje \"x\"]");}UZOL **zisti_max(UZOL **uzol){	while((*uzol)->r) uzol=&(*uzol)->r;	return uzol;}void vymazaj(UZOL **koren, int i){	UZOL *pom, **pom2;	while(*koren && (*koren)->x != i)	{		if((*koren)->x >i) koren=&(*koren)->l;		else koren=&(*koren)->r;	}	if(!(*koren)) return;	if((*koren)->l ==0 || (*koren)->r ==0)	{		pom=*koren;		*koren=((*koren)->l ==0) ? (*koren)->r : (*koren)->l;		free(pom);	}	else	{		pom2=zisti_max(&(*koren)->l);		(*koren)->x = (*pom2)->x;		pom=*pom2;		if((*pom2)->l ==0) *pom2=0;		else *pom2=(*pom2)->l;		free(pom);	}}int main(int argc, char *argv[]){	int i=1, kresli=0, vstup;	char *pom;	if(argc<2) return 1;	if(*((*(argv+1))+1)=='v')		kresli=1;	if(kresli) ++i;	for(;i<argc;++i)	{		pom=*(argv+i);		if(strlen(pom) <=1) continue;		if( ((pom[0]!='i')&&(pom[0]!='d')) ||			( (pom[1]!='-') && ! ( (pom[1]>='0')&&(pom[1]<='9')))) 			continue;		vstup=atoi(pom+1);		if(*pom=='i') pridaj(&koren,vstup);		if(*pom=='d') vymazaj(&koren,vstup);		if(kresli) 		{			max_hladina=0;			hlbka(koren,0);			vypis_graficky(koren);			if(i!=argc-1) printf("\ndalsia zmena:");			else printf("\n");		}	}		if(!kresli)	{		hlbka(koren,0);		vypis_graficky(koren);		printf("\n");	}	return;}