Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
Pensar en C++ (Volumen 1) - Grupo ARCO
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 />
✐