Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: samur88 en 4 Enero 2011, 03:00 am



Título: Problemas con punteros en listas.
Publicado por: samur88 en 4 Enero 2011, 03:00 am
Saludos.

Tengo la siguiente duda:
Tengo el siguiente codigo fuente de una lista circular:

Código:

#include <stdio.h>
#include <stdlib.h>

typedef struct listacompleta {
         int dato;
         struct listacompleta *next;
        }lista;


void add_nod(lista **nodoe, int dato){
 lista *nuevo,*aux;
 nuevo = (lista *) malloc (sizeof(lista));
 nuevo->dato = dato;
 aux = *nodoe;
 if(*nodoe == NULL ){
             nuevo->next = nuevo;
             *nodoe = nuevo;
            } else{
              /* *nodoe = *nodoe->next; */
               nuevo->next = aux->next;
               aux->next = nuevo;
              }
}



int main(){
 lista *nodoe;
 nodoe = NULL;
 
 add_nod(&nodoe,8);
 add_nod(&nodoe,2);
 add_nod(&nodoe,3);
 add_nod(&nodoe,5);

 system("pause");
 return 0;

}


El caso es que dentro de add_nod la linea que esta comentada no me compila, pero me gustaría avanzar en uno el elemento nodoe para agregar elementos a partir del ultimo insertado en la lista circular, como puedo hacer eso y por que me da error al compilar, me he mirado el error y creo que es porque es un puntero de puntero, pero no se como solucionarlo.

Un saludo y gracias a todos.


Título: Re: Problemas con punteros en listas.
Publicado por: Ferno en 4 Enero 2011, 04:42 am
Tienes que usar paréntesis!!!

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct listacompleta {
  5.         int dato;
  6.         struct listacompleta *next;
  7.        }lista;
  8.  
  9.  
  10. void add_nod(lista **nodoe, int dato){
  11. lista *nuevo,*aux;
  12. nuevo = (lista *) malloc (sizeof(lista));
  13. nuevo->dato = dato;
  14. aux = *nodoe;
  15. if(*nodoe == NULL ){
  16.             nuevo->next = nuevo;
  17.             *nodoe = nuevo;
  18.            } else{
  19.               *nodoe = (*nodoe)->next;
  20.               nuevo->next = aux->next;
  21.               aux->next = nuevo;
  22.              }
  23. }
  24.  
  25.  
  26.  
  27. int main(){
  28. lista *nodoe;
  29. nodoe = NULL;
  30.  
  31. add_nod(&nodoe,8);
  32. add_nod(&nodoe,2);
  33. add_nod(&nodoe,3);
  34. add_nod(&nodoe,5);
  35.  
  36. system("pause");
  37. return 0;
  38.  
  39. }


Título: Re: Problemas con punteros en listas.
Publicado por: samur88 en 4 Enero 2011, 13:23 pm
Muchas gracias :)
Discúlpame ¿Podrías decirme o explicarme por que uso el paréntesis? es que no conocía esa nomenclatura al usar punteros.
Un saludo y Feliz Año Nuevo. :)


Título: Re: Problemas con punteros en listas.
Publicado por: Ferno en 4 Enero 2011, 14:16 pm
Bueno, es que al desreferenciar dicha variable sin paréntesis estás desreferenciando nodoe->next, y lo que tu quieres desreferenciar es solo nodoe, el cual es un puntero a puntero de struct. Tu quieres hacer: (**nodoe).next == (*nodoe)->next.
Si le quitas los paréntesis, es como hacer *(nodoe->next) lo cual es un error porque no existe ningún campo en la variable (*nodoe) ya que es sólo un puntero a struct (debes desreferenciar solamente nodoe nuevamente para acceder a la struct correspondiente y al campo next en ella).

Espero que se haya entendido!
Salú!


Título: Re: Problemas con punteros en listas.
Publicado por: samur88 en 7 Enero 2011, 16:13 pm
Muchas gracias por contestar, y disculpa la tardanza estos día con las fiestas en la familia no he podido conectarme mucho, con desreferenciar quieres decir quitar el puntero a puntero, para acceder a el, no?
Si es así creo que lo he entendido todo, lo que no entiendo muy bien es el concepto de desreferenciar.
Un saludo y gracias de nuevo :)


Título: Re: Problemas con punteros en listas.
Publicado por: Oblivi0n en 7 Enero 2011, 16:51 pm
Cuando desreferencias (aplicando * antes de la variable) accedes a la direccion de memoria de dicha variable, al hacer (*nodoe)->next, accedes a la direccion de memoria de nodoe, si no utilizas parentesis accedecias a la direccion de memoria de nodoe->next

Creo que no me he equivocado  :laugh: , espero que te sirva la explicacion

Saludos!


Título: Re: Problemas con punteros en listas.
Publicado por: samur88 en 10 Enero 2011, 00:09 am
Muchísimas gracias creo que ya entendí todo : )