/* ORDENA Y MUESTRA LAS LINEAS DE UN FICHERO, UTILIZANDO MEMORIA DINAMICA * Lee cada línea y la inserta ordenadamente en una tabla de * punteros a cadena, despues muestra la tabla */ #include #include #include #define NL 100 /* Número de lineas máximo que almacena */ #define NC 100 /* Tamaño máximo de cada linea */ /* VARIABLES GLOBALES */ /* Tabla con 100 punteros a caracter */ char *tlineas[NL]; /* Tabla donde guardo las lineas */ void MostrarTcadenas ( char *tc[], int numl ) { int i; for (i = 0; i< numl ; i++ ) { printf("%s",tc[i] ); } } /* Interta la cadena señalada por pcar en la tabla de cadenas tc ordenadamente, solicitando memoria dinámica */ void InsertarEnOrden ( char *tc[], char *pcar, int nl ) { int i,j; i=0; /* Mientra sea más grande */ while ( ( i < nl ) ) { if ( strcmp( pcar, tc[i] ) <0 ) { // mas grande break; } i++; } /* Desplazo para hacer hueco */ for (j = nl; j > i; j--) { tc[j] = tc[j - 1]; } /* Tamaño de la cadena +1 ( caracter NULL ) */ tc[i] = (char *) malloc( strlen(pcar) +1 ); /* Copio la cadena */ strcpy (tc[i],pcar); } int main ( int argc, char *argv[] ) { int numlin; char cadena[NC]; FILE *fp; if ( argc > 1 ) { fp = fopen(argv[1],"r"); } else { // Si no hay ningún parámetro leo de la entrada estandar fp = stdin; } if ( fp == NULL ) { perror(argv[1]); exit(1); } numlin = 0; fgets(cadena,NC,fp); while ( ! feof(fp) && (numlin < NL ) ) { InsertarEnOrden( tlineas, cadena, numlin ); numlin++; fgets(cadena,NC,fp); } MostrarTcadenas ( tlineas, numlin ); getchar(); fclose(fp); return 0; }