/****************************************************
* *
* *
* *
* * ISRAEL CUEVA HIDALGO. *
* *
* *
****************************************************/
/*
Se pretende desarrollar un directorio que contenga los datos de Nombre,
Edad, Telefono y Ciudad, y que a su vez nos permita ingresar los datos
por teclado, mostrar los registros ingresados en la pantalla y por último
realizar las mismas consultas pero ordenados por los diferentes campos
que se nombro anteriormente.
*/
#include <stdio.h>
#include <stdlib.h>
#define fichero «registro.txt»
//Declaracion de la estructura tRegistro que tendrá
//los campos del directorio
typedef struct stRegistro
{
char nombre[15];
char edad[4];
char ciudad[13];
char telefono[13];
};
//Estructura Arbol que toma la estructura de un Nodo
typedef struct Arbol
{
struct stRegistro dato;
struct Arbol* izq;
struct Arbol* der;
};
//declaración de metodos
int crearNodo(struct Arbol **nuevo, struct stRegistro valor);
int insertarHoja(struct Arbol * arbol, struct stRegistro valor);
int insertarArbol(struct Arbol **arbol, struct stRegistro valor);
void InOrden(struct Arbol * arbol);
int ordenar();
int anadir();
void Listar();
void Eliminar();
strcmp();
int clave = 0;
//——————
//MÉTODO PRINCIPAL
//——————
main()
{
char opcion[1];
int opcionCampo=0;
do
{
system(«cls»);
printf(«___________________________________\n\n»);
printf(» Estructura Datos – Elige opcion\n»);
printf(«___________________________________\n\n»);
printf(» 1) Insertar registro\n»);
printf(» 2) Mostrar Registro\n»);
printf(» 3) Ordenar por campo\n»);
printf(» 4) Eliminar registro\n»);
printf(» 0) Salir\n»);
printf(«\n\nOpcion: «);
gets(opcion);
if(opcion == 0 )
{
system(«cls»);
printf(«\n\n\n\t* * G R A C I A S * *\n\n\n»);
system(«PAUSE»);
system(«exit»);
}
switch (atoi(opcion))
{
case 1:
anadir();
break;
case 2:
system(«cls»);
printf(«____________________________________________\n\n»);
printf(» REGISTRO\n»);
printf(«____________________________________________\n\n»);
printf(» Nombre Edad Ciudad Telefono \n\n»);
//while(fread(®, sizeof(struct stRegistro), 1, fichero2))
//Listar(®);
Listar();
system(«PAUSE»);
break;
case 3:// Ordenar por campo
do
{
system(«cls»);
printf(«________________________\n\n»);
printf(» 3) Ordenar por campo\n»);
printf(«_________________________\n\n»);
printf(«\n 1) Ordenar por nombre\n»);
printf(» 2) Ordenar por edad\n»);
printf(» 3) Ordenar por ciudad\n»);
printf(» 4) Ordenar por telefono\n»);
printf(«\nOpcion: «);
scanf(«%d»,&opcionCampo);
if(opcionCampo == 1)
{
clave = 1;
system(«cls»);
printf(«\n\n\n\t\tCAMPO ORDENADO POR NOMBRE\n\n\n»);
system(«PAUSE»);
system(«cls»);
printf(«____________________________________________\n\n»);
printf(» REGISTRO\n»);
printf(«____________________________________________\n\n»);
printf(» Nombre Edad Ciudad Telefono \n\n»);
ordenar();
printf(«\n»);
system(«PAUSE»);
opcionCampo=-1;
main();
}
if(opcionCampo == 2)
{
clave = 2;
system(«cls»);
printf(«\n\n\n\t\tCAMPO ORDENADO POR EDAD\n\n\n»);
system(«PAUSE»);
system(«cls»);
printf(«____________________________________________\n\n»);
printf(» REGISTRO\n»);
printf(«____________________________________________\n\n»);
printf(» Nombre Edad Ciudad Telefono \n\n»);
ordenar();
printf(«\n»);
system(«PAUSE»);
opcionCampo=-1;
main();
}
if(opcionCampo == 3)
{
clave = 3;
system(«cls»);
printf(«\n\n\n\t\tCAMPO ORDENADO POR CIUDAD\n\n\n»);
system(«PAUSE»);
system(«cls»);
printf(«____________________________________________\n\n»);
printf(» REGISTRO\n»);
printf(«____________________________________________\n\n»);
printf(» Nombre Edad Ciudad Telefono \n\n»);
ordenar();
printf(«\n»);
system(«PAUSE»);
opcionCampo=-1;
main();
}
if(opcionCampo == 4)
{
clave = 4;
system(«cls»);
printf(«\n\n\n\t\tCAMPO ORDENADO POR TELEFONO\n\n\n»);
system(«PAUSE»);
system(«cls»);
printf(«____________________________________________\n\n»);
printf(» REGISTRO\n»);
printf(«____________________________________________\n\n»);
printf(» Nombre Edad Ciudad Telefono \n\n»);
ordenar();
printf(«\n»);
system(«PAUSE»);
opcionCampo=-1;
main();
}
}while (opcionCampo != -1);
break;
case 4:
system(«cls»);
Eliminar();
printf(«\n\n\n\t\tREGISTRO ELIMINADO\n\n\n»);
system(«PAUSE»);
break;
}
}while(atoi(opcion) != 0);
return 0;
}
//FIN DEL MÉTODO PRINCIPAL
//—————————————————————————–
// * Crea el nuevo nodo con el valor que se desea, en el caso de que no exista
//—————————————————————————–
int crearNodo(struct Arbol **nuevo, struct stRegistro valor)//nodo raiz
{
int correcto = 0;
//Reservamos espacio en memoria y lo asignamos al puntero de estrucura Nodo
*nuevo = (struct Arbol *) malloc(sizeof(struct Arbol));
//Si (*nuevo) en este caso es diferente de NULL
if ((*nuevo) != NULL)
{
(*nuevo)->dato = valor;
(*nuevo)->izq = NULL;
(*nuevo)->der = NULL;
correcto = 1;
}
return correcto;
}
//——————————————————————
/**
* Inserto el nuevo nodo como una hoja del árbol, y sirve para ordenar como
* se requiera de acuerdo al campo desaado
*/
//——————————————————————
int insertarHoja(struct Arbol * arbol, struct stRegistro valor)
{
struct Arbol * nuevo;
int correcto = 0;
if(clave ==1 )
{
//La funcion strcmp: Compara la cadena apuntada por *valor.nombre*, con la cadena
//apuntada por *arbol->dato.nombre*. Esta función retorna un entero mayor, igual o
//que cero.
//Si el valor devuelto por la función strcmp es menor que cero entro
if (strcmp(valor.nombre, arbol->dato.nombre) < 0)
{
//Si el a lo que apunta el puntero izquierdo es diferente de NULL
if (arbol->izq != NULL)
{
//Se cunple una función recursiva y se retornará el valor de correcto
//Este puede ser 1 – 0
correcto = insertarHoja(arbol->izq, valor);
}
//Caso contrario
else
{
//Si El dato es == NULL indica que no tiene una estructura de Nodo
//En este caso se indica al método crear_que lo cree
if (crearNodo(&nuevo, valor))
{
//nuevo(De estructura Nodo(Nodo)
arbol->izq = nuevo;
correcto = 1;
}
}
}
//Caso contrario: Si el valor devuelto por la función strcmp es
// mayor o igual que cero entro
else
{
//Voy por la rama derecha considerada como siguinte
//Si rama siguinte es diferente de null
if (arbol->der != NULL)
{
//recursividad, para insertar un nuevo nodo como hoja
correcto = insertarHoja(arbol->der, valor);
}
//Si es null
else
{
//Creo un nuevo nodo con estructura de Nodo
if (crearNodo(&nuevo, valor))
{
arbol->der = nuevo;
correcto = 1;
}
}
}
}
//si clave es igual a 2, aplicaremos el mismo procedimiento izquierdo
//con clave 0 a 1, simplemente va a variar en la funcion strcmp los
//parametros de comparación
//se repitira el mismo procedimiento para clave = 3 y 4. Cambiando
//únicamente el valor de busqueda.
if(clave ==2 )
{
if (strcmp(valor.edad, arbol->dato.edad) < 0)
{
if (arbol->izq != NULL)
{
correcto = insertarHoja(arbol->izq, valor);
}
else
{
if (crearNodo(&nuevo, valor))
{
arbol->izq = nuevo;
correcto = 1;
}
}
}
else
{
if (arbol->der != NULL)
{
correcto = insertarHoja(arbol->der, valor);
}
else
{
if (crearNodo(&nuevo, valor))
{
arbol->der = nuevo;
correcto = 1;
}
}
}
}
if(clave ==3 )
{
if (strcmp(valor.ciudad, arbol->dato.ciudad) < 0)
{
if (arbol->izq != NULL)
{
correcto = insertarHoja(arbol->izq, valor);
}
else
{
if (crearNodo(&nuevo, valor))
{
arbol->izq = nuevo;
correcto = 1;
}
}
}
else
{
if (arbol->der != NULL)
{
correcto = insertarHoja(arbol->der, valor);
}
else
{
if (crearNodo(&nuevo, valor))
{
arbol->der = nuevo;
correcto = 1;
}
}
}
}
if(clave ==4 )
{
if (strcmp(valor.telefono, arbol->dato.telefono) < 0)
{
if (arbol->izq != NULL)
{
correcto = insertarHoja(arbol->izq, valor);
}
else
{
if (crearNodo(&nuevo, valor))
{
arbol->izq = nuevo;
correcto = 1;
}
}
}
else
{
if (arbol->der != NULL)
{
correcto = insertarHoja(arbol->der, valor);
}
else
{
if (crearNodo(&nuevo, valor))
{
arbol->der = nuevo;
correcto = 1;
}
}
}
}
return correcto;
}
//——————————————————————-
/*
* Miro si el árbol está vacío o con nodos
*/
//——————————————————————-
int insertarArbol(struct Arbol **arbol, struct stRegistro valor)
{
struct Arbol* nuevo;
int correcto = 0;
//Los punteros son NULL
if (*arbol == NULL)
{
//Si son nulos
if (crearNodo(&nuevo, valor))
{
*arbol = nuevo;
correcto = 1;
}
}
else
{
correcto = insertarHoja(*arbol, valor);
}
return correcto;
}
//——————————————————————
/**
* Muestro el contenido del árbol mostrándolo en inorden
*/
//——————————————————————
void InOrden(struct Arbol * arbol)
{
//compruebo que la raiz sea diferente que NULL
if (arbol != NULL)
{
//Recorremos el árbol izquierdo, incluyendo su raiz
InOrden(arbol->izq);
//Presento con la estructura que aqui se expone
printf(» %s \t%s\t%s\t %s\n», arbol->dato.nombre, arbol->dato.edad
,arbol->dato.ciudad,arbol->dato.telefono);
//Recorro el árbol derecho
InOrden(arbol->der);
//estos son métodos recursivos donde si no se encuentra un nodo se salta al
//derecho en este caso a la rama derecha (derecho)
}
}
//——————————————————————-
/**
* Recojo cada registro y lo incluyo en el árbol
*/
//——————————————————————-
int ordenar()
{
FILE *f;
struct stRegistro r;
struct Arbol* arbol = NULL;
int correcto = 0;
//Abrimos el fichero en modo lectura y le asignamos la
//la posicion al de memoria a puntero Tipo FILE f
//si f es distinto de NULL
if ((f = fopen(fichero, «r»)) != NULL)
{
//Leemos el archivo con la posicion de memoria de Campos(Datos)
//al igualemte indicamos su tamaño con la funcion sizeof y le indicamos el
//archivo de donde queremos leer
while (fread(&r, sizeof(r), 1, f))
{
//Comparo las dos cadenas que tenemos con nombre
if (strcmp(r.nombre, «*») != 0)
{
//Si es diferente de cero el valor devuelto
insertarArbol(&arbol, r);
}
}
//Cerramos el archivo para volver a ser utilizado
fclose(f);
InOrden(arbol);
correcto = 1;
}
return correcto;
}
//——————————————————————–
/*
Añado registros al fichero
*/
//——————————————————————–
int anadir()
{
FILE *f;
//FILE *f2;//
struct stRegistro r;
int correcto = 0;
if ((f = fopen(fichero, «a»)) != NULL)
{
//f2 = fopen(fichero2, «a»);
system(«cls»);
printf(«_________________________________\n\n»);
printf(» Ingresa datos del registro\n»);
printf(«_________________________________\n\n»);
printf(«Nombre: «);
gets(r.nombre);
//fgets(reg->nombre, 15, stdin);
printf(«Edad : «);
gets(r.edad);
printf(«Ciudad: «);
gets(r.ciudad);
printf(«Telef : «);
gets(r.telefono);
//Escribimos el archivo
fwrite(&r, sizeof(r), 1, f);
//fwrite(&r, sizeof(r),1,f2);
//fclose(f2);
fclose(f);
correcto = 1;
}
return correcto;
}
void Listar()
{
FILE *f3;
struct stRegistro reg;
if ((f3 = fopen(fichero, «r»)) != NULL)
{
while (fread(®, sizeof(reg), 1, f3))
{
printf(» %s \t%s\t%s\t %s\n», reg.nombre, reg.edad
,reg.ciudad,reg.telefono);
}
fclose(f3);
}
printf(«\n»);
}
void Eliminar()
{
FILE *f4;
if ((f4 = fopen(fichero, «w»)) != NULL)
{
fclose(f4);
}
printf(«\n»);
}