arboles binarios de busqueda
Necesito ayuda con un programa de tipo agenda telefonica, programado con arboles binarios de busqueda.
En la que se pide el: apellido, nombre, fono, direccion
y luego se almacenan en un arreglo base a, b, c, d.....z segun apellido, pero la estructura debe kedar en un ABB.
Si alguien tiene algun programa base que me ayude porfa es urgente...
o si esta dispuesto ayudarme con el codigo que tengo echo:
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<stdlib.h>
#include<string.h>
#define memoria (struct apellidos *)malloc(sizeof(struct apellidos))
struct datos_apellidos{
char apellido[20];
char nombre[20];
int fono;
char direccion[30];
};
struct apellidos{
char apellido[20];
struct apellidos *izq,*der;
struct datos_apellidos datos;
}*ap,*auxapellidos;
int fono;
//--------------------------------------------------------------------------------
//Nombre: inicializacion
//Tipo: constructora
//Entrada: Puntero Raiz
//Salida: raiz inicializada
void inicializa(struct apellidos **ap)
{
*ap=NULL;
}
//Nombre: insercion_binaria
//Tipo: modificadora
//Entrada: Puntero Raiz , valor nuevo
//Salida: arbol modificado
void insercion_apellidos(struct apellidos **ap, char apellid[20])
{
*ap=auxapellidos;
if((*ap)==NULL)
{
(*ap)=memoria;
if((*ap)!=NULL)
{
strcpy((*ap)->apellido,apellid);
(*ap)->der=NULL;
(*ap)->izq=NULL;
strcpy(auxapellidos->datos.apellido,(*ap)->apellido);
printf("nIngrese Nombre: ");
gets(auxapellidos->datos.nombre);
fflush(stdin);
printf("nIngrese fono: ");
scanf("%d",&fono);
fflush(stdin);
auxapellidos->datos.fono=fono;
printf("nIngrese direccion: ");
gets(auxapellidos->datos.direccion);
fflush(stdin);
//imprime los datos para verificar si los graba
printf("nfono> %d",auxapellidos->datos.fono);
printf("napellidoap> %s",(*ap)->apellido);
printf("napellidoaux> %s",auxapellidos->datos.apellido);
//se supone que guarda la estructura
FILE *stream;
if ((stream = fopen("guiatelef.dat", "wb")) == NULL) /* open file TEST.$$$ */
{
fprintf(stderr, "Cannot open output file.n");
}
fwrite(&ap, sizeof(ap), 1, stream); /* write struct s to file */
fclose(stream); /* close file */
}
else{
printf("%s no insertado.n",apellid);
}
}
else if(apellid>(*ap)->apellido)
insercion_apellidos(&(*ap)->der,apellid);
else if(apellid<(*ap)->apellido)
insercion_apellidos(&(*ap)->izq,apellid);
else printf("Dato duplicado.n");
}
// -----------------------------------------------------------------------------
//Nombre: inorden
//Tipo: analizadora
//Entrada: Puntero Raiz
//Salida: vista del arbol
void inorden (struct apellidos *ap)
{
if(ap!=NULL)
{
inorden(ap->izq);
printf("%s ",ap->apellido);
inorden(ap->der);
}
}
//menu
char apellido[20];
char buscar[20];
int i=0;
void main()
{
clrscr();
inicializa(&ap);
for(i=0;i<3;i++){
printf("nIngrese apellido: ");
gets(apellido);
fflush(stdin);
insercion_apellidos(&ap,apellido);
}
inorden(ap);
clrscr();
printf("nBuscar fono por apellidon");
auxapellidos=ap;
//queriamos buscar el numero de fono por el apellido
//pero no guarda los apellidos...
printf("ningrese apellido a buscar: ");
gets(buscar);
fflush(stdin);
if (strcmp(ap->apellido,buscar)==0)
{
if(auxapellidos->apellido!=NULL)
{
printf("%s",auxapellidos->apellido);
printf("%s",ap->datos.fono);
}
}
else printf("no son iguales");
getch();
}
En la que se pide el: apellido, nombre, fono, direccion
y luego se almacenan en un arreglo base a, b, c, d.....z segun apellido, pero la estructura debe kedar en un ABB.
Si alguien tiene algun programa base que me ayude porfa es urgente...
o si esta dispuesto ayudarme con el codigo que tengo echo:
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
#include<stdlib.h>
#include<string.h>
#define memoria (struct apellidos *)malloc(sizeof(struct apellidos))
struct datos_apellidos{
char apellido[20];
char nombre[20];
int fono;
char direccion[30];
};
struct apellidos{
char apellido[20];
struct apellidos *izq,*der;
struct datos_apellidos datos;
}*ap,*auxapellidos;
int fono;
//--------------------------------------------------------------------------------
//Nombre: inicializacion
//Tipo: constructora
//Entrada: Puntero Raiz
//Salida: raiz inicializada
void inicializa(struct apellidos **ap)
{
*ap=NULL;
}
//Nombre: insercion_binaria
//Tipo: modificadora
//Entrada: Puntero Raiz , valor nuevo
//Salida: arbol modificado
void insercion_apellidos(struct apellidos **ap, char apellid[20])
{
*ap=auxapellidos;
if((*ap)==NULL)
{
(*ap)=memoria;
if((*ap)!=NULL)
{
strcpy((*ap)->apellido,apellid);
(*ap)->der=NULL;
(*ap)->izq=NULL;
strcpy(auxapellidos->datos.apellido,(*ap)->apellido);
printf("nIngrese Nombre: ");
gets(auxapellidos->datos.nombre);
fflush(stdin);
printf("nIngrese fono: ");
scanf("%d",&fono);
fflush(stdin);
auxapellidos->datos.fono=fono;
printf("nIngrese direccion: ");
gets(auxapellidos->datos.direccion);
fflush(stdin);
//imprime los datos para verificar si los graba
printf("nfono> %d",auxapellidos->datos.fono);
printf("napellidoap> %s",(*ap)->apellido);
printf("napellidoaux> %s",auxapellidos->datos.apellido);
//se supone que guarda la estructura
FILE *stream;
if ((stream = fopen("guiatelef.dat", "wb")) == NULL) /* open file TEST.$$$ */
{
fprintf(stderr, "Cannot open output file.n");
}
fwrite(&ap, sizeof(ap), 1, stream); /* write struct s to file */
fclose(stream); /* close file */
}
else{
printf("%s no insertado.n",apellid);
}
}
else if(apellid>(*ap)->apellido)
insercion_apellidos(&(*ap)->der,apellid);
else if(apellid<(*ap)->apellido)
insercion_apellidos(&(*ap)->izq,apellid);
else printf("Dato duplicado.n");
}
// -----------------------------------------------------------------------------
//Nombre: inorden
//Tipo: analizadora
//Entrada: Puntero Raiz
//Salida: vista del arbol
void inorden (struct apellidos *ap)
{
if(ap!=NULL)
{
inorden(ap->izq);
printf("%s ",ap->apellido);
inorden(ap->der);
}
}
//menu
char apellido[20];
char buscar[20];
int i=0;
void main()
{
clrscr();
inicializa(&ap);
for(i=0;i<3;i++){
printf("nIngrese apellido: ");
gets(apellido);
fflush(stdin);
insercion_apellidos(&ap,apellido);
}
inorden(ap);
clrscr();
printf("nBuscar fono por apellidon");
auxapellidos=ap;
//queriamos buscar el numero de fono por el apellido
//pero no guarda los apellidos...
printf("ningrese apellido a buscar: ");
gets(buscar);
fflush(stdin);
if (strcmp(ap->apellido,buscar)==0)
{
if(auxapellidos->apellido!=NULL)
{
printf("%s",auxapellidos->apellido);
printf("%s",ap->datos.fono);
}
}
else printf("no son iguales");
getch();
}
