13.01.2015 Views

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

Pensar en C++ (Volumen 1) - Grupo ARCO

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

✐<br />

✐<br />

✐<br />

“Volum<strong>en</strong>1” — 2012/1/12 — 13:52 — page 163 — #201<br />

✐<br />

4.8. Estructuras anidadas<br />

unidad de traducción. Cuando use ese tipo, deberá incluir el fichero de cabecera para<br />

efectuar las declaraciones apropiadam<strong>en</strong>te.<br />

A veces ese patrón se seguirá <strong>en</strong> este libro, pero más a m<strong>en</strong>udo los ejemplos<br />

serán muy pequeños, así que todo - la declaración de las estructuras, la definición<br />

de las funciones, y la función main() - pued<strong>en</strong> aparecer <strong>en</strong> un único fichero. Sin<br />

embargo, t<strong>en</strong>ga pres<strong>en</strong>te que debería usar ficheros separados y ficheros de cabecera<br />

para aplicaciones reales.<br />

4.8. Estructuras anidadas<br />

La conv<strong>en</strong>i<strong>en</strong>cia de coger nombres de funciones y datos fuera del espacio de nombre<br />

global es aplicable a las estructuras. Puede anidar una estructura d<strong>en</strong>tro de otra<br />

estructura, y por tanto guardar juntos elem<strong>en</strong>tos asociados. La sintaxis de declaración<br />

es la que podría esperarse, tal como puede ver <strong>en</strong> la sigui<strong>en</strong>te estructura, que<br />

implem<strong>en</strong>ta una pila como una lista <strong>en</strong>lazada simple de modo que «nunca» se queda<br />

sin memoria.<br />

//: C04:Stack.h<br />

// Nested struct in linked list<br />

#ifndef STACK_H<br />

#define STACK_H<br />

struct Stack {<br />

struct Link {<br />

void* data;<br />

Link* next;<br />

void initialize(void* dat, Link* nxt);<br />

}* head;<br />

void initialize();<br />

void push(void* dat);<br />

void* peek();<br />

void* pop();<br />

void cleanup();<br />

};<br />

#<strong>en</strong>dif // STACK_H ///:~<br />

La struck anidada se llama Link, y conti<strong>en</strong>e un puntero al sigui<strong>en</strong>te Link <strong>en</strong><br />

la lista y un puntero al dato almac<strong>en</strong>ado <strong>en</strong> el Link. Si el sigui<strong>en</strong>te puntero es cero,<br />

significa que es el último elem<strong>en</strong>to de la lista.<br />

Fíjese que el puntero head está definido a la derecha después de la declaración<br />

de la struct Link, es lugar de una definición separada Link* head. Se trata de<br />

una sintaxis que vi<strong>en</strong>e de C, pero que hace hincapié <strong>en</strong> la importancia del punto y<br />

coma después de la declaración de la estructura; el punto y coma indica el fin de una<br />

lista de definiciones separadas por comas de este tipo de estructura (Normalm<strong>en</strong>te<br />

la lista está vacía.)<br />

La estructura anidada ti<strong>en</strong>e su propia función initialize(), como todas las<br />

estructuras hasta el mom<strong>en</strong>to, para asegurar una inicialización adecuada. Stack<br />

ti<strong>en</strong>e tanto función initialice() como cleanup(), además de push(), que<br />

toma un puntero a los datos que se desean almac<strong>en</strong>ar (asume que ha sido alojado<br />

<strong>en</strong> el montículo), y pop(), que devuelve el puntero data de la cima de la Stack y<br />

elimina el elem<strong>en</strong>to de la cima. (El que hace pop() de un elem<strong>en</strong>to se convierte <strong>en</strong><br />

163<br />

✐<br />

✐<br />

✐<br />

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!