elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Listas en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Listas en C++  (Leído 3,136 veces)
farresito


Desconectado Desconectado

Mensajes: 302



Ver Perfil
Listas en C++
« en: 9 Marzo 2011, 15:01 pm »

Hola a todos,

Tengo una pequeña duda que no acabo de resolver; es muy simple, pero es por quitármela de encima. Tengo este código, que funciona perfectamente, pues lo he quitado del libro del que estoy estudiando, pero no logro entender una cosa concreta. El el código siguiente, cuando se declara la estructura STRUCT T_NODO *PRINCIPIO, si solo es un puntero que indica el inicio de toda la lista, no podria declarar una variable puntero normal que guardase la direccion de memoria del lugar donde se inicia la la lista?. Esto es lo que tengo

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7. struct t_nodo
  8. {
  9.    int numero; // Almacena los datos del nodo
  10.    t_nodo *siguiente; // Variable puntero a otra estructura t_nodo
  11. };
  12.  
  13. struct t_nodo *principio = NULL;
  14.  
  15.  
  16. int main (void)
  17. {
  18.    //Declaro la funcion; lo podria haber puesto todo junto pero da igual
  19.    void insertar_al_principio (struct t_nodo *&p);
  20.  
  21. }
  22.  
  23. void insertar_al_principio (struct t_nodo *&p)
  24. {
  25.    struct t_nodo *nuevo_nodo;
  26.  
  27.    // Creamos nuevo nodo
  28.  
  29.    nuevo_nodo = new struct t_nodo;
  30.  
  31.    // Rellenamos los campos de datos
  32.  
  33.    cout << "Escriba un numero: " << endl;
  34.    cin >> nuevo_nodo->numero;
  35.  
  36.    /* Insertamos el nuevo nodo al principio de la lista */
  37.    nuevo_nodo->siguiente = p;
  38.    p = nuevo_nodo;
  39. }
  40.  

Gracias de antemano. Un abrazo!


En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Listas en C++
« Respuesta #1 en: 9 Marzo 2011, 15:41 pm »

Para apuntar a una lista, necesitas un puntero a lista, y si tu lista es un "struct t_nodo" necesitas para apuntarlo un "struct tnodo"* . No hay un "puntero genérico" y tampoco puedes apuntar a una dirección de memoria en concreto, porque tu programa NUNCA (bueno, vale, puede suceder) se va a ejecutar en la misma sección de memoria, o va a declarar su memoria dinámica en la misma dirección, sino que la dirección se la dará el sistema operativo teniendo en cuenta lo que quede libre en ese momento.

Cuando tu declaras un puntero a entero, ese puntero está hecho para apuntar a una zona de memoria de 4 bytes (u 8, según la máquina) cuyo contenido se procesa como número entero. En cambio, no puedes tuilizar un puntero a entero para apuntar a un char, porque el char ocupa 1/4 de un entero, y por tanto, te comes el char y 3 de su alrededor.

Lo mismo pasa con las estructuras, cuando tu declaras un puntero a una estructura, digamos que preparas el puntero para hacer referencia a los campos de dicha estructura.


« Última modificación: 9 Marzo 2011, 15:44 pm por Akai » En línea

farresito


Desconectado Desconectado

Mensajes: 302



Ver Perfil
Re: Listas en C++
« Respuesta #2 en: 9 Marzo 2011, 16:36 pm »

Gracias Akai, me lo dejaste claro ;)

Ahora también me surgió la duda de porque uso *&p. El ampersand se que se usa para recibir la dirección de memoria de alguna variable o cualquier cosa si lo pongo delante, pero en este caso, no podría pasar por parámetros directamente struct t_nodo *p?
Me suena haber leído que los parámetros con & hace que no se copie el valor de la variable y se trabaje con ella sino que lo que se hace es trabajar directamente con la propia variable. Es correcto lo que digo o me olvido de algo?

Gracias, un abrazo
En línea

Akai


Desconectado Desconectado

Mensajes: 823



Ver Perfil
Re: Listas en C++
« Respuesta #3 en: 9 Marzo 2011, 18:01 pm »

Te comento, en C++, cuando tu utilizas el & en la cabecera de una función, como en el caso:
Código
  1. void insertar_al_principio (struct t_nodo *&p)

Lo que se está diciendo es : En vez de pasarme una copia de p, quiero que me lo pases por referencia. Con esto se consiguen dos cosas: no copias la estructura, y cualquier cambio que hagas dentro de la función se mantendrá fuera.

Posiblemente sea más claro de leer si estuviese puesto así:
Código
  1. void insertar_al_principio (struct t_nodo* &p)
De esta forma, digamos que dices que recibes un puntero a nodo, pasado por referencia.

La diferencia entre pasar por referencia y por copia es la siguiente:

Suponiendo que nuestra variable vale 4
Código
  1. void foo(int x){
  2. x++;
  3. }
  4.  
La función termina y la variable que nos han pasado sigue valiendo 4, porque en realidad hemos modificado la copia de dicha variable que se ha pasado a la función, y que ha sido destruida al terminar.

Seguimos suponiendo que vale 4
Código
  1. void foo(int &x){
  2. x++;
  3. }
  4.  
Aquí nuestra variable valdría 5, porque hemos pasado no una copia de ella, sino su referencia. Y por tanto, hemos modificado más allá del alcance de la función.

Para hacer esto en C, tenías que especificar en la función que recibirías un puntero, y bien pasar la dirección de la variable cuando llamases a la función, o bien un puntero a la misma para poder modificarla dentro de la propia función y que dicho cambio existiese fuera.
En línea

farresito


Desconectado Desconectado

Mensajes: 302



Ver Perfil
Re: Listas en C++
« Respuesta #4 en: 10 Marzo 2011, 12:54 pm »

Gracias Akai. Me has aclarado las ideas. Me sonaba pero ahora lo tengo claro. Creo que lo que me ha despistado es no verlo así:

Código:
void insertar_al_principio (struct t_nodo* &p)

Realmente pensaba que había un puntero genérico; no exactamente, pero si de algún modo, pero veo que estaba equivocado :)

Un abrazo. Agradezco mucho tu ayuda ;)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Listas
PHP
Darksurgeon13 1 2,068 Último mensaje 19 Diciembre 2009, 19:28 pm
por Og.
Uso de Listas: Subprograma que lea 2 listas y forme una.
Dudas Generales
hbenitez 2 3,314 Último mensaje 8 Agosto 2010, 20:11 pm
por hbenitez
Ayuda Acerca De Listas y Listas Circulares (Revienta Memoria :S)
Programación C/C++
Gerik 0 5,177 Último mensaje 12 Septiembre 2010, 01:49 am
por Gerik
Uso de listas y ficheros en C.
Programación C/C++
tenji 4 3,986 Último mensaje 24 Junio 2011, 22:54 pm
por Gallu
listas
Programación C/C++
johrdy 3 2,202 Último mensaje 5 Marzo 2012, 00:35 am
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines