Sunteți pe pagina 1din 6

Arboles

Programacin en C

RBOLES

Prof. Jos A. Rodrguez Mondjar Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 1

Arboles

Programacin en C

Introduccin

Los rboles son tiles en todos aquellos problemas donde la informacin est jerarquizada. Elementos de un rbol
Nodo:
Nodo padre: Tiene nodos hijos. Nodo hijo: Tiene un nodo padre. Nodo raiz o raiz del rbol: No tiene nodo padre. Nodo terminal u hoja: No tiene nodos hijos

Nodo raiz

Nodo padre

Nodo hijo

Nodo hoja

Altura o profundidad del rbol Subrbol:


rbol que cuelga de un nodo.
Prof. Jos A. Rodrguez Mondjar Prof. lvaro Snchez Miralles

Subrbol

UPCO ICAI Departamento de Electrnica y Automtica 2

Arboles

Programacin en C typedef struct stNodoGen { char sNom[20]; int nHijos; struct stNodoGen *pHijos; } TNodoGen; Informacin nHijos= 2 pHijos Pseudocdigo ArbolRecorrer ArbolRecorrer(Nodo) { Recursiva Calculo(Nodo); if (Hay hijos) { Por cada hijo ArbolRecorrer(Nodo hijo) } }
UPCO ICAI Departamento de Electrnica y Automtica 3

Programacin en C

Estructuras recursivas Funciones recursivas para recorrer el rbol.


Informacin

Informacin nHijos= 2 pHijos

nHijos= 1 pHijos Informacin nHijos= 0 pHijos

Prof. Jos A. Rodrguez Mondjar Prof. lvaro Snchez Miralles

Arboles

Programacin en C

Ejemplo: rbol genealgico.


gen.txt Pedro 2 Antonio 3 Carmen 0 Rafael 0 Gloria 0 Fernando 1 Juan 2 Maria 0 Juana 0 arbolgen.h typedef struct stNodoGen { char sNom[20]; int nHijos; struct stNodoGen *pHijos; } TNodoGen; void void void void ArbolGenImp(FILE *pfic, TNodoGen *p); ArbolGenLee(FILE *pfic, TNodoGen *p); ArbolGenSalva(FILE *pfic, TNodoGen *p); ArbolGenBorra(TNodoGen *p); Pedro Antonio Carmen Rafael Gloria Mara
Prof. Jos A. Rodrguez Mondjar Prof. lvaro Snchez Miralles

Fernando Juan Juana

UPCO ICAI Departamento de Electrnica y Automtica 4

Arboles

Programacin en C

Leer el rbol genealgico


void ArbolGenLee(FILE *pfic, TNodoGen *p) { int i; if (feof(pfic)) return; fscanf(pfic,"%s",p->sNom); fscanf(pfic,"%d",&(p->nHijos)); p->pHijos=NULL; if (p->nHijos>0) MemReserva(p->nHijos,sizeof(TNodoGen),(void **)&(p->pHijos)); for (i=0;i<p->nHijos;i++){ ArbolGenLee(pfic,&(p->pHijos[i])); } }
Prof. Jos A. Rodrguez Mondjar Prof. lvaro Snchez Miralles UPCO ICAI Departamento de Electrnica y Automtica 5

Arboles

Programacin en C

Salvar e imprimir rbol genealgico

void ArbolGenSalva(FILE *pfic, TNodoGen *p){ int i; fprintf(pfic,"%s\n",p->sNom); fprintf(pfic,"%d\n",p->nHijos); for(i=0;i<p->nHijos;i++) ArbolGenSalva(pfic,p->pHijos+i); }

Prof. Jos A. Rodrguez Mondjar Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 6

Arboles

Programacin en C

Imprimir rbol de forma ms elegante


void ArbolGenImp(FILE *pfic, TNodoGen *p){ int i; fprintf(pfic,"%s",p->sNom); if (p->nHijos>0) { fprintf(pfic,":"); for(i=0;i<p->nHijos;i++) { fprintf(pfic," %s",p->pHijos[i].sNom); } fprintf(pfic,"\n"); for(i=0;i<p->nHijos;i++) { if (p->pHijos[i].pHijos>0) ArbolGenImp(pfic,p->pHijos+i); } } }

Prof. Jos A. Rodrguez Mondjar Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 7

Arboles

Programacin en C

Borrar rbol
Primero borrar los hijos si los hay

void ArbolGenBorra(TNodoGen *p) { int i;

for(i=0;i<p->nHijos;i++) { ArbolGenBorra(p->pHijos+i); } MemLibera(&(p->nHijos),sizeof(TNodoGen), (void **)&(p->pHijos)); }

Prof. Jos A. Rodrguez Mondjar Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 8

Arboles

Programacin en C

Programa de prueba
main() { FILE *pfic; TNodoGen Padre;

// Nodo padre

MemIni(); fprintf(stdout,"Memoria inicial %ld\n",MemConsulta()); if ((pfic=fopen("gen.txt","r"))==NULL) return 1; ArbolGenLee(pfic,&Padre); ArbolGenSalva(stdout,&Padre); ArbolGenImp(stdout,&Padre); ArbolGenBorra(&Padre); fprintf(stdout,"Memoria final %ld\n",MemConsulta()); return 0; }
Prof. Jos A. Rodrguez Mondjar Prof. lvaro Snchez Miralles UPCO ICAI Departamento de Electrnica y Automtica 9

Arboles

Programacin en C

Resultados del programa de prueba


Memoria inicial 0 Pedro 2 Antonio 3 Carmen 0 Rafael 0 Gloria 0 Fernando 1 Juan 2 Maria 0 Juana 0 Pedro: Antonio Fernando Antonio: Carmen Rafael Gloria Fernando: Juan Juan: Maria Juana Memoria final 0

Prof. Jos A. Rodrguez Mondjar Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 10

Arboles

Programacin en C

Otro ejemplo: gestin de un sistema grfico

Primitivas de dibujo:
Punto. Recta. Polgono. Crculo

Ventana

Ventana1

Primitivas de organizacin
Ventana

Ventana10

Ventana0

Prof. Jos A. Rodrguez Mondjar Prof. lvaro Snchez Miralles

UPCO ICAI Departamento de Electrnica y Automtica 11

Arboles

Programacin en C

Estructuras para el sistema grfico


typedef enum {Recta, Triangulo, SplineLin, Poligono, Circulo} TClaseFigura; typedef struct { int x; int y; } TPto; typedef struct { int n; TPto *pPto; TClaseFigura Clase; } TFigura; typedef struct TVentana{ TPto Pos[2]; int nFig; TFigura *pFig; int nVenHijas; struct TVentana *pHijas; } TVentana;
Prof. Jos A. Rodrguez Mondjar Prof. lvaro Snchez Miralles

Punto Figura

Dice como tratar los puntos de la figura Ventana con figuras y subventanas

UPCO ICAI Departamento de Electrnica y Automtica 12

S-ar putea să vă placă și