/* DIBUJA UN ARBOL BINARIO EN PANTALLA
DE DATOS LEIDOS DE UN ARCHIVO
SE HACE USO DE LA LIBRERIA GRAPHICS
*/
#include <graphics.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void activa_modo_grafico(void);
void cierra_modo_grafico(void);
void circulo(int, int, char dato[2]);
void linea(int, int, int, int);
void muestra_arbol(void);
void enlista(struct arbol *);
#define hy(y) (y-10)
#define dy(y) (y+10)
#define texto(x) (x-3)
struct arbol
{
int x1;
int y1;
int x2;
int y2;
char dato[2];
struct arbol *sig;
};
struct arbol *lista;
void activa_modo_grafico(void)
{
int gdriver = DETECT, gmode, errorcode;
initgraph(&gdriver, &gmode, "c:\\tc30.pp\\bgi"); // inicializa el modo grAfico
errorcode = graphresult(); // lee resultado de la inicializaciOn
if (errorcode != grOk) // ocurriO un error
{
printf("Error grafico: %s\n", grapherrormsg(errorcode));
exit(1);
}
}
void cierra_modo_grafico(void)
{ closegraph(); }
void circulo(int x,int y, char dato[5])
{
circle(x, y, 10); outtextxy(texto(x), texto(y), dato);
}
void linea(int x1, int y1, int x2, int y2) // traza linea(dex,dey,ax,ay)
{
if( (x1==x2) && (y1==y2) );
else line(x1, dy(y1), x2, hy(y2));
}
void muestra_arbol(void)
{
char cad[2];
while(lista)
{
cad[0]=lista->dato[0];
cad[1]='\0';
circulo(lista->x2,lista->y2,cad);
linea(lista->x1,lista->y1,lista->x2,lista->y2);
lista = lista->sig;
}
}
void enlista(struct arbol *nodo)
{
struct arbol *copia_del_nodo=NULL;
copia_del_nodo = (struct arbol *)malloc(sizeof(struct arbol));
copia_del_nodo->x1 = nodo->x1; copia_del_nodo->y1 = nodo->y1;
copia_del_nodo->x2 = nodo->x2; copia_del_nodo->y2 = nodo->y2;
sprintf(copia_del_nodo->dato,"%s",nodo->dato);
copia_del_nodo->dato[2]='\0';
copia_del_nodo->sig = NULL;
if(!lista) lista = copia_del_nodo;
else
{
copia_del_nodo->sig = lista;
lista = copia_del_nodo;
}
}
void lee_datos(char arch_in[12])
{
struct arbol *nodo=NULL;
FILE *file_in;
char lectura[5];
if ((file_in = fopen(arch_in,"rt")) == NULL) // archivo de entrada
{ printf("No se puede abrir el archivo"); return; }
fgets(lectura, 5, file_in);
nodo = (struct arbol *)malloc(sizeof(struct arbol));
while (strncmp(lectura,"ok",2) != 0)
{
nodo->x1 = atoi(lectura);
fgets(lectura, 5, file_in); nodo->y1 = atoi(lectura);
fgets(lectura, 5, file_in); nodo->x2 = atoi(lectura);
fgets(lectura, 5, file_in); nodo->y2 = atoi(lectura);
fgets(lectura, 5, file_in); sprintf(nodo->dato, "%s",lectura);
nodo->dato[2]='\0';
enlista(nodo);
fgets(lectura, 5, file_in);
}
fclose(file_in);
}
void main(void)
{
lista = NULL;
system("gen_arb.exe");
lee_datos("datos.arb");
activa_modo_grafico();
muestra_arbol();
getch();
cierra_modo_grafico();
}