/* ----------------------------------------------------------------- Muestra las palabras que tiene un fichero en Orden Alfabético Almacenando cada palabra en un arbol ordenado, guardando las primeras 10 posiciones donde ha aparecido * ----------------------------------------------------------------- */ #include #ifndef PALINUX #include #endif #include #define LONGPMAX 50 // Longitud máxima de una palabra #define NUMAPARICIONES 10 // Máximo número de apariciones struct sarbol { char palabra[LONGPMAX]; // Palabra unsigned short Tpos [NUMAPARICIONES]; // Tabla de posiciones unsigned short numap; // Contador de apariciones struct sarbol *izda; // Puntero subarbol Izquierdo struct sarbol *dcha; // Puntero subarbol Derecho }; typedef struct sarbol Elemento; /* FUNCIONES AUXILIARES */ int LeerPalabra ( char *Pala , FILE *fp, short *contlinea ); int EsAlfabetica( char c ); int CarCastellano ( char c ); Elemento * AnotarPalabra ( Elemento *parbol, char *pala , short numlinea ); void MostrarArbol ( Elemento *paux ); /*-------------------------------------------------------------------- * FUNCION : int LeerPalabra ( char *Pala , FILE *fp ) * * DESCRIPCION : lee una palabra del fichero stream * * PARAMETROS : * Pala ( OUT) : String con la palabra que ha leido * fp (IN/OUT): Fichero stream de donde lee. * contlinea (IN/OUT): Contador de líneas * * DEVUELVE : 0 : Si no ha encontrado ninguna palabra por llegar * al final de fichero * N : Número de caracteres de la palabra leida * --------------------------------------------------------------------*/ int LeerPalabra ( char *Pala , FILE *fp, short *contlinea ) { int i; char car; i = 0; car = (char) getc(fp); while ( !feof(fp) && ! EsAlfabetica(car) ) { if ( car == '\n') { *contlinea = *contlinea + 1; // Cuento la linea } car = (char) getc(fp); } while ( !feof(fp) && EsAlfabetica(car) ) { Pala[i] = car; i++; car = (char) getc(fp); } if ( car == '\n') { *contlinea = *contlinea + 1; // Cuento la linea } Pala[i] = '\0'; /* Si no ha encontrado palabra devuelve 0 */ return i; } /*-------------------------------------------------------------------- * FUNCION : int EsAlfabetica( char c ) * * DESCRIPCION : Indica si un caracter es o no alfabéticos * * PARAMETROS : * c ( IN) : Caracter a ckequear. * * DEVUELVE : 1 si es / 0 si no. * --------------------------------------------------------------------*/ int EsAlfabetica( char c ) { if ( ((c >= 'a') && ( c <= 'z')) || ((c >= 'A') && ( c <= 'Z')) || CarCastellano (c) ) { return 1; } else { return 0; } } /*-------------------------------------------------------------------- * FUNCION : int CarCastellano ( char c ) * * DESCRICION : Indica si es una vocal acentuada o una ñ * * PARAMETROS : * c ( IN ) : Car cter a analizar. * * DEVUELVE : 1 o 0, si es o no castellano * --------------------------------------------------------------------*/ int CarCastellano ( char c ) { char *tccast = "áéíóúñÑÁÉÍÓÚü"; // Caracteres MS-DOS int i; for ( i = 0; i< 12 ; i++ ) { if ( c == tccast[i] ) { return 1; } } return 0; } /*-------------------------------------------------------------------- * FUNCION : AnotarPalabra * * DESCRICION : Almacena la palabra pasada como parámetro en un * arbol binario ordenado, si ya existe, anota * en que posición a vuelto a aparecer * * PARAMETROS : * parbol (IN/OUT) : Puntero al árbol * palabra ( IN ) : Puntero a la Palabra a guardar. * numlinea ( IN ) : Número de línea donde aparece * * DEVUELVE : Puntero al árbol modificado * --------------------------------------------------------------------*/ Elemento * AnotarPalabra ( Elemento *parbol, char *pala , short numlinea ) { Elemento *paux; int resu; paux = parbol; // Si no está if ( paux == NULL ) { paux = (Elemento *) malloc ( sizeof ( Elemento ) ); if ( paux != NULL ) { strcpy(paux->palabra,pala); // Guardo la palabra paux->numap = 1; // Una aparición paux->Tpos[0] = numlinea; // Guardo el número de línea paux->dcha = NULL; paux->izda = NULL; } } else { resu = strcmp(pala,paux->palabra); // Si ya está almacenada if ( resu == 0 ) { // Si no supera el número máximo de apariciones if ( paux->numap < NUMAPARICIONES ) { paux->Tpos[paux->numap]= numlinea; paux->numap++; } } else { if ( resu > 0 ) { paux->dcha = AnotarPalabra( paux->dcha,pala,numlinea); } else { paux->izda = AnotarPalabra( paux->izda,pala,numlinea); } } } return paux; } /*-------------------------------------------------------------------- * FUNCION : void MostrarArbol ( Elemento *paux ) * * DESCRIPCION : Muestra el contenido del árbol de palabras * realizando un recorrido en Orden Central * * * PARAMETROS : * paux (IN) : Puntero al árbol de palabras a mostrar * * DEVUELVE : NADA * --------------------------------------------------------------------*/ void MostrarArbol ( Elemento *paux ) { int i; if ( paux != NULL ) { MostrarArbol( paux->izda ); printf("\n%-20s: ",paux->palabra); for( i=0; i < paux->numap ; i++ ) printf(" %4d,",paux->Tpos[i]); MostrarArbol( paux->dcha); } } /* PROGRAMA PRINCIPAL */ int main( int argc, char *argv[]) { FILE *fent; char Palabra[LONGPMAX]; Elemento *Raiz = NULL; short contlineas; if ( argc != 2 ) { puts(" Error en parámetros "); return (1); } fent = fopen( argv[1],"r"); if ( fent == NULL ) { printf(" Error al abrir el fichero %s.",argv[1]); return (1); } contlineas = 1; while ( ! feof(fent) ) { if ( LeerPalabra ( Palabra, fent , & contlineas) > 0 ) { Raiz = AnotarPalabra ( Raiz, Palabra, contlineas ); } } MostrarArbol(Raiz); puts(" --- FIN DEL PROCESO -----"); fclose(fent); return (0); }