Page 252

4.4 Redimensionamiento de la reserva de memoria

No es lo mismo un puntero que un vector Aunque C permite considerarlos una misma cosa en muchos contextos, hay algunas diferencias entre un puntero a una serie de enteros, por ejemplo, y un vector de enteros. Consideremos un programa con estas declaraciones: 1 2 3 4

int int int int

vector [10]; escalar ; * puntero; * otro_puntero;

A los punteros debe asign´ arseles expl´ıcitamente alg´ un valor: • a la ((nada)): puntero = NULL; • a memoria reservada mediante malloc: puntero = malloc(5*sizeof (int)); • a la direcci´ on de memoria de una variable escalar del tipo al que puede apuntar el puntero: puntero = &escalar ; • a la direcci´ on de memoria en la que empieza un vector: puntero = vector ; • a la direcci´ on de memoria de un elemento de un vector: puntero = &vector [2]; • a la direcci´ on de memoria apuntada por otro puntero: puntero = otro_puntero; • a una direcci´ on calculada mediante aritm´etica de punteros: por ejemplo, puntero = vector +2 es lo mismo que puntero = &vector [2]. Los vectores reservan memoria autom´ aticamente, pero no puedes redimensionarlos. Es ilegal, por ejemplo, una sentencia como ´esta: vector = puntero. Eso s´ı, las funciones que admiten el paso de un vector v´ıa par´ ametros, admiten tambi´en un puntero y viceversa. De ah´ı que se consideren equivalentes. Aunque suponga una simplificaci´ on, puedes considerar que un vector es un puntero inmutable (de valor constante).

· 242 Dise˜ na una funci´ on que muestre por pantalla todas la palabras del diccionario que acaban con un sufijo dado (una cadena). ............................................................................................. La funci´ on que determina si una palabra pertenece o no a un diccionario requiere tanto m´as tiempo cuanto mayor es el n´ umero de palabras del diccionario. Es as´ı porque el diccionario est´a desordenado y, por tanto, la u ´nica forma de estar seguros de que una palabra no est´a en el diccionario es recorrer todas y cada una de las palabras (si, por contra, la palabra est´a en el diccionario, no siempre es necesario recorrer el listado completo). Podemos mejorar el comportamiento de la rutina de b´ usqueda si mantenemos el diccionario siempre ordenado. Para ello hemos de modificar la funci´on de inserci´on de palabras en el diccionario: 1 2 3

void inserta_palabra_en_diccionario(struct Diccionario *d, char pal []) { int i, j;

4 5 6 7 8 9 10

for (i=0; i<d->palabras; i++) { if (strcmp(d->palabra[i], pal )==0) // Si ya est´ a, no hay nada que hacer. return; if (strcmp(d->palabra[i], pal )>0) // Aqu´ı hemos encontrado su posici´ on (orden alfab´etico) break; }

11 12 13

/* Si llegamos aqu´ı, la palabra no est´ a y hay que insertarla en la posici´ on i, desplazando antes el resto de palabras. */

15 16 17 18 19

246

/* Reservamos espacio en la lista de palabras para una m´ as. */ d->palabra = realloc(d->palabra, (d->palabras+1) * sizeof (char *)); /* Desplazamos el resto de palabras para que haya un hueco en el vector. */ for (j=d->palabras; j>i; j--) { Introducci´ on a la Programaci´ on con C

Profile for esLibre.com

Introducción a la programación con c  

Introducción a la programación con c  

Advertisement