Problemas con punteros en listas.

Iniciado por samur88, 4 Enero 2011, 03:00 AM

0 Miembros y 1 Visitante están viendo este tema.

samur88

Saludos.

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



#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.

Ferno

Tienes que usar paréntesis!!!

#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;

}

samur88

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. :)

Ferno

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ú!

samur88

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 :)

Oblivi0n

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!

samur88

Muchísimas gracias creo que ya entendí todo : )