• Viernes 17 de Mayo de 2024, 04:26

Autor Tema:  Duda punteros  (Leído 852 veces)

locoxchacho

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Duda punteros
« en: Miércoles 30 de Septiembre de 2009, 21:27 »
0
Buenas tardes a todos!

Soy nuevo en este foro, y espero que me puedan ayudar a resolver una duda que tengo con una implementacion de pilas dinamicas en C.

En realidad, la duda no es sobre la implementacion de las pilas en si, sino de una parte del codigo de la misma. Las pilas estan definidas de esta forma, mediante un struct:

Código: C
  1. typedef void *dato_t;
  2.  
  3. typedef struct{
  4.     dato_t *datos;
  5.     int tope;
  6.     int tamanio;
  7. }pila_d;
  8.  

Ahora, como veran, datos es un puntero a datos_t, que imaginemos, lo redefino para que sea de tipo int. La duda, entonces, es como accedo a datos:

Código: C
  1. bool pila_apilar(pila_d *pilad, dato_t valor){
  2.     if(pilad->tope >=pilad->tamanio){
  3.         if(!pila_cambiar_tamanio(pilad,pilad->tamanio*2)){
  4.             return false;}}
  5.     pilad->datos[pilad->tope++] = valor;
  6.     return true;
  7. }
  8.  

LO que hace esta parte es, si el tope es igual al tamaño, entonces le asigna el doble de memoria a ese puntero. Eso esta claro (no pongo la funcion, pero practimante es un mallo con el tamanio de tamanio por el tamanio del tipo de dato). Lo que no entiendo, es esto:

Código: C
  1. pilad->datos[pilad->tope++] = valor;
  2.  

asgina a datos, que es un puntero a dato_t (digamos, int) como si fuese un array. Lo que no logro entender es eso: si realmente un array no es mas que un puntero del cual se reserva tanta memoria como se pida para tantos elementos del tipo que se especifique? y los indices serian para ver en que porcion de la memoria estoy?

Si es asi, ya comprendo como funciona esa parte del codigo, al igual que los arrays. si no es asi, entonces, si alguien me podria ayudar, mejor!


desde ya, muchas gracias por su ayuda, espero haber sido claro!

pablo

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Duda punteros
« Respuesta #1 en: Jueves 1 de Octubre de 2009, 11:41 »
0
Primero, decirte que estás usando C++ y no C, ya que bool no es un tipo de datos que exista en C, pero sí en C++.

Creo que la implementación de esta pila es mediante un array de punteros, esto es, sería equivalente a:

Código: C
  1. typedef struct{
  2.     dato_t datos[];
  3.     int tope;
  4.     int tamanio;
  5. }pila_d;
  6.  
Y ya se va reservando memoria y los punteros se guardan en el vector datos (que al fin y al cabo también es un puntero). Pero para ello hay que reservar primero el espacio para el vector de punteros datos, ya que en un principio no tiene memoria alguna asignada. Por esto mismo sería interesante ver la inicialización de la pila y también la función pila_cambiar_tamanio (que supongo debería usar realloc() más que malloc()).

Si fuera una pila implementada mediante una lista dinámica (sin vectores) debería tener nodos, algo así (enlazado simple):

Código: C
  1. /* Nodo (elemento) de la pila */
  2. typedef struct
  3. {
  4.     dato_t dato;
  5.     nodo* sig;
  6. } nodo;
  7.  
  8. /* La pila en sí */
  9. typedef struct
  10. {
  11.     nodo* cabeza;
  12.     int num_elementos;
  13. } pila;
  14.  
es decir, un elemento que apunta a otro siguiente y así sucesivamente.

locoxchacho

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Duda punteros
« Respuesta #2 en: Jueves 1 de Octubre de 2009, 16:21 »
0
HOla!

Gracias por tu ayuda. 1ro, te comento que estoy usando C, pero importo la libreria stdbool.h, y es por eso que puedo utilizar el tipo bool.

Otra cosa: a lo que tu estas llamando pila, nosotros le llamamos lista simplemente enlazada y, efectivamente, es asi: con un nodo que apunta a otro nodo, y asi sucecisamente hasta que uno apunte a NULL.

Por otro lado, ya resolvi mi duda y si, la memoria que pedia vendria a funcionar igual que los arrays, que si mal no entendi, son porciones conjuntas de memoria.


Desde ya, muchas gracias por tu ayuda.

Pablo.