/*
+----------------------------------------------------+
| ORDENACION DE UN FICHERO (SIMILAR AL SORT DEL DOS) |
+----------------------------------------------------+
Este programa lee las líneas de un fichero de entrada (que
puede ser la consola) y escribe las líneas ordenadas en un fichero
de salida (que puede ser la consola).
*/
#include <stdio.h> /* printf (), gets (), FILE, fopen (), fclose (),
NULL, fprintf (), fgets () */
#include <stdlib.h> /* exit () */
#include <alloc.h> /* malloc (), free () */
#include <conio.h> /* getch () */
#include <string.h> /* strcmp (), strcpy () */
#include <ctype.h> /* toupper () */
#define BOOLEAN int
#define TRUE 1
#define FALSE 0
#define ESC 27
#define ENTER '\r' /* no vale '\n' */
#define NUMMAXCARACTERES 255
struct nodo_arbol
{
char linea[NUMMAXCARACTERES];
struct nodo_arbol *pizq, *pder;
};
void inicializar_arbol (struct nodo_arbol **parb);
void hacer_nodo_arbol (struct nodo_arbol **pa);
void insertar_en_arbol (struct nodo_arbol **parb, char *lin);
void imprimir_arbol (struct nodo_arbol *parb, FILE *pfichsal);
void liberar_arbol (struct nodo_arbol **parb);
void main (void)
{
BOOLEAN salir = FALSE;
char nombre_fichero_entrada[NUMMAXCARACTERES],
nombre_fichero_salida[NUMMAXCARACTERES],
linea_fichero[NUMMAXCARACTERES];
FILE *pfe, *pfs; /* punteros a fichero de entrada y fichero de
salida resp. */
char ch;
struct nodo_arbol *parbol;
while (! salir)
{
puts ("\n\nORDENACION DE FICHEROS.\n");
printf ("Introduzca nombre de fichero de entrada (ENTER o CON "
"para teclado): ");
gets (nombre_fichero_entrada);
if (*nombre_fichero_entrada == '\0')
strcpy (nombre_fichero_entrada, "con");
printf ("Introduzca nombre de fichero de salida (ENTER o CON "
"para pantalla): ");
gets (nombre_fichero_salida);
if (*nombre_fichero_salida == '\0')
strcpy (nombre_fichero_salida, "con");
if ((pfe = fopen (nombre_fichero_entrada, "r")) == NULL)
printf ("\nERROR: No es posible abrir el fichero de entrada "
"%s.\n", nombre_fichero_entrada);
else if ((pfs = fopen (nombre_fichero_salida, "w")) == NULL) {
printf ("\nERROR: No es posible abrir el fichero de salida "
"%s.\n", nombre_fichero_salida);
fclose (pfe); }
else { inicializar_arbol (&parbol);
while (fgets (linea_fichero, sizeof (linea_fichero), pfe) !=
NULL)
insertar_en_arbol (&parbol, linea_fichero);
imprimir_arbol (parbol, pfs);
fclose (pfe);
fclose (pfs);
liberar_arbol (&parbol);
}
printf ("\n\n¿Desea ordenar otro fichero (S o ENTER: Sí; N o "
"ESC: No)? ");
do
{
ch = getch ();
} while (ch != ENTER && toupper (ch) != 'S' &&
ch != ESC && toupper (ch) != 'N');
salir = ch == ESC || toupper (ch) == 'N';
}
}
void inicializar_arbol (struct nodo_arbol **parb)
{
*parb = NULL;
}
void hacer_nodo_arbol (struct nodo_arbol **pa)
{
if ((*pa = (struct nodo_arbol *) malloc (sizeof (struct
nodo_arbol))) == NULL)
{
printf ("\nERROR: Memoria insuficiente.");
exit (1);
}
}
void insertar_en_arbol (struct nodo_arbol **parb, char *lin)
{
struct nodo_arbol *p, *pant, *pa;
hacer_nodo_arbol (&pa);
strcpy (pa->linea, lin);
pa->pizq = pa->pder = NULL;
p = *parb;
pant = NULL;
while (p != NULL)
{
pant = p;
if (strcmp (p->linea, lin) > 0)
p = p->pizq;
else
p = p->pder;
}
if (pant == NULL)
*parb = pa;
else if (strcmp (pant->linea, lin) > 0)
pant->pizq = pa;
else
pant->pder = pa;
}
void imprimir_arbol (struct nodo_arbol *parb, FILE *pfichsal)
{
if (parb != NULL)
{
imprimir_arbol (parb->pizq, pfichsal);
fprintf (pfichsal, parb->linea);
imprimir_arbol (parb->pder, pfichsal);
}
}
void liberar_arbol (struct nodo_arbol **parb)
{
if (*parb != NULL)
{
liberar_arbol (&(*parb)->pizq);
liberar_arbol (&(*parb)->pder);
free (*parb);
}
}