bsort.c - ¡Bienvenido a paloalto.unileon.es!

Anuncio
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]);
}
}
Descargar