bsort.c Programación estructurada en C y memoria dinámica. Esquema general. Programa bsort.c: Dos funciones. Función burbuja, prototipo: void burbuja(char **cadenas, int ncadenas) **cadenas, reformulación aprox.: char *cadenas[]: Un array de punteros a cadenas de caracteres. Función main: Captura un número indefinido de cadenas de caracteres. Programa bsort.c: Cabecera. #include <stdio.h> #include <stdlib.h> #include <string.h> #define BUFFER_SIZE 256 char linea[BUFFER_SIZE]; Programa bsort.c: Función burbuja(). void burbuja(char *cadenas[], int ncadenas){ int i, j, mas; char *tmp; j = ncadenas; mas = 1; while (mas) { mas = 0; j = j - 1; for (i = 0; i < j; i++) { if (strcmp(cadenas[i], cadenas[i+1]) > 0) { tmp = cadenas[i+1]; cadenas[i+1] = cadenas[i]; cadenas[i] = tmp; mas = 1; } } } } Programa bsort.c: Función main(). Esta función lee un número indefinido de cadenas El usuario del programa entra las cadenas una a una. Cuando el usuario entra ctrl-Z, la función gets() asume que se ha provisto una entrada vacía y que ha de terminar. Programa bsort.c: gets(char *s) int gets(char *s) Esta función toma una cadena provista por el usuario (teclado) y la copia en la cadena s. Devuelve un int: si es NULL, eso significa que el usuario ha provisto una entrada vacía. La cadena s ha de ser suficientemente amplia para salvar la cadena más grande que puede entrar el usuario. Programa bsort.c: main. Capturar un número indefinido de cadenas. Cada cadena, una vez entrada mediante gets(), se copia en memoria dinámica mediante strdup(). La dirección de cada cadena se guarda en un array de punteros a cadenas: char **punteros = NULL; char *punteros[] = NULL; Programa bsort.c: main. void main(){ char **punteros = NULL; int n, ncadenas, num_punteros; ncadenas = 0; num_punteros = 0; while (gets(linea) != NULL) { if (ncadenas == num_punteros) { if (num_punteros == 0) { num_punteros = 8; punteros = malloc(num_punteros * sizeof(char *)); } else { num_punteros += 8; punteros = realloc(punteros, num_punteros * sizeof(char *)); } if (punteros == NULL){ fprintf(stdout,"No hay memoria suficiente.\n"); exit(1); } } punteros[ncadenas++] = strdup(linea); } burbuja(punteros, ncadenas); for (n = 0; n < ncadenas; n++) { printf("%s\n",punteros[n]); free(punteros[n]); } }