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

 

 


Tema destacado: Introducción a la Factorización De Semiprimos (RSA)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema con listas enlazadas.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con listas enlazadas.  (Leído 4,132 veces)
samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Problema con listas enlazadas.
« en: 28 Noviembre 2010, 18:26 pm »

Hola, tengo el siguiente problema que me trae totalmente loco con el tema de las listas enlazadas en C.

El caso es que tengo el siguiente código:

Código:
#include <stdio.h>
#include <stdlib.h>

typedef struct elementslist {
         int data;
         struct elementslist *next;
        }element;

element *first,*nodo,*nodo2;

void insertarnodo(element *nodo, int dato){
                nodo = (element*) malloc(sizeof(element));
                nodo->data = dato;
                nodo->next = NULL;
                first = nodo;
     }

main(){
 first = NULL;
 insertarnodo(nodo,5);
 printf("%d\n",nodo->data);
}

Este código me compila pero cuando lo ejecuto se me cierra y no imprime el valor de la lista.
Luego tengo este otro que si me funciona pero no se si esta mal o bien programado, el caso es que me gustaría saber por que el primero no me funciona y el segundo si, ya que al tratarse de variables globales no tengo por que retornar ningún nodo como en el segundo.

Código:
#include <stdio.h>
#include <stdlib.h>

typedef struct elementslist {
         int data;
         struct elementslist *next;
        }element;

element *first,*nodo,*nodo2;

element *insertarnodo(element *nodo, int dato){
                nodo = (element*) malloc(sizeof(element));
                nodo->data = dato;
                nodo->next = NULL;
                first = nodo;
                return nodo;
     }

main(){
 first = NULL;
 nodo = insertarnodo(nodo,5);
 printf("%d\n",nodo->data);
}

Un saludo a todos.


En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: Problema con listas enlazadas.
« Respuesta #1 en: 28 Noviembre 2010, 20:40 pm »

El error que salta en el primer código es de fallo de segmentación.
Porque la variable nodo que tenes en la función no es la misma. Cuando haces esto:
Código
  1. void insertarnodo(element *nodo, int dato)
  2.  
Al nodo que tenes entre paréntesis le estas cargando datos, pero el nodo original sigue conteniendo basura.
tendría que ser asi:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct elementslist
  5. {
  6. int data;
  7. struct elementslist *next;
  8. }element;
  9.  
  10. //element *first,*nodo,*nodo2;
  11. element *primero,*nodo;
  12.  
  13. void insertarnodo(element *nodo_aux, int dato)
  14. {
  15. //nodo = (element*) malloc(sizeof(element));
  16. nodo_aux->data = dato;
  17. nodo_aux->next = NULL;
  18. primero = nodo;
  19. }
  20.  
  21. int main()
  22. {
  23. primero = NULL;
  24. nodo = (element*) malloc( sizeof( element ) );
  25. insertarnodo(nodo,5);
  26.  
  27. printf("%d\n",nodo->data);
  28.  
  29. free(nodo);
  30. return 0;
  31. }
  32.  

Aca te explica bien ese error, casi al final.


En línea

samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: Problema con listas enlazadas.
« Respuesta #2 en: 28 Noviembre 2010, 21:21 pm »

Muchísimas gracias por la respuesta, ahora ya lo tengo todo claro, era por la localidad de las variables en las funciones de hay que mi segundo codigo funcione y este no, ya que el segundo devolveria un puntero a la zona de declaracion que declare en la función.

Tengo una duda, tanto en el código que me has pasado como en el segundo, no puedo recorrer la lista de la siguiente forma, podrías ayudarme:

Código:
ultimo = primero;
while (ultimo->next != NULL){
     printf("%d",ultimo->data);
     ultimo = ultimo->next;
     }
Me compila y me ejecuta pero no me imprime los valores de la lista.
Un saludo y gracias de nuevo.
En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: Problema con listas enlazadas.
« Respuesta #3 en: 28 Noviembre 2010, 21:48 pm »

De nada.
No te muestra los valores porque salta otro fallo de segmentación.
Código
  1. element *ultimo = primero;
  2. do
  3. {
  4. printf("\n%d\n",ultimo->data);
  5. ultimo = ultimo->next;
  6. //}while (ultimo->next != NULL); //esto tira fallo de segmentacion
  7. }while (ultimo != NULL );
  8.  
En línea

samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: Problema con listas enlazadas.
« Respuesta #4 en: 28 Noviembre 2010, 22:25 pm »

Muchas gracias por la respuesta ^^ el codigo que me pusiste funciono a la perfección, pero no veo donde se encuentra el error de segmentación en el que yo puse, puedes explicármelo?
Un saludo.
En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: Problema con listas enlazadas.
« Respuesta #5 en: 28 Noviembre 2010, 23:04 pm »

de nada.
si.
En realidad tu código no tira fallo de segmentación, no entra al ciclo directamente:
Código
  1. ultimo = primero;
  2. /*
  3. No entra porque next SI esta apuntando a NULL
  4. */
  5. while (ultimo->next != NULL)
  6. {
  7.     printf("%d",ultimo->data);
  8.     ultimo = ultimo->next;
  9. }
  10.  

Lo que quise decir es que si lo pones al revés, para intentar que muestre "algo" por pantalla, asi:
Código
  1. element *ultimo = primero;
  2. do
  3. {
  4. printf("\n%d\n",ultimo->data);
  5. ultimo = ultimo->next;
  6. }while (ultimo->next != NULL);
  7.  
Ahi si tira un fallo de segmentación porque llega un momento en el que "ultimo" es igual a NULL y vos estás preguntando si "ultimo->next..." cuando "ultimo"  ya no tiene nada, porque es NULL.
No se si se entiende bien.
En línea

samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: Problema con listas enlazadas.
« Respuesta #6 en: 29 Noviembre 2010, 00:07 am »

Gracias qily, una cosita que no entiendo muy bien, ultimo contendría NULL, eso quiere decir que ultimo-next no existiria, ¿no? sería algo así como que ya que las dos variables de "ultimo" serian Null por lo tanto ultimo-next no estaría.
¿Algo así me quieres decir?
Por cierto, me puedes mandar algún enlace donde expliquen bien todos los fallos de segmentación, es que en la otra pagina me han quedado clara algunas cosas, pero esto de los bucles no muy claras.
Un saludo.
En línea

Beakman

Desconectado Desconectado

Mensajes: 190



Ver Perfil WWW
Re: Problema con listas enlazadas.
« Respuesta #7 en: 29 Noviembre 2010, 00:48 am »

Citar
...ultimo contendría NULL, eso quiere decir que ultimo-next no existiria, ¿no? sería algo así como que ya que las dos variables de "ultimo" serian Null por lo tanto ultimo-next no estaría.
¿Algo así me quieres decir?
Claro, como no existe y estas queriendo sacar de donde no hay te tira error.

Los fallos de segmentación aparecen cuando querés entrar a un sector de memoria que no esta permitido o no existe
En wikibooks te dan algunos ejemplos.
Busca mas info de punteros con diferentes cosas, estructuras, objetos, etc. Y proba los codigos.
Y los problemas que tienen otros con los fallos de segmentación.  :)
En línea

samur88

Desconectado Desconectado

Mensajes: 125


Ver Perfil
Re: Problema con listas enlazadas.
« Respuesta #8 en: 29 Noviembre 2010, 00:50 am »

Muchas gracias por todo qily, mirare mas ejemplos y preguntare las dudas que tenga en el foro ^.^.
Saludos y gracias de nuevo.
En línea

EddyC

Desconectado Desconectado

Mensajes: 4


Ver Perfil
Re: Problema con listas enlazadas.
« Respuesta #9 en: 4 Diciembre 2010, 19:18 pm »

Hola que tal , mira te voy a dejar otra manera de cargar la lista la cual se maneja con punteros dobles te dejo las funciones , ami nunca me trajeron problemas , las probas y cualquier duda me decis .

Código:

//ESTRUCTURAS :

typedef struct
{ // ingresas la info aca
}t_info ;

typedef struct s_nodo
{t_info data;
 struct s_nodo *sig;
}t_nodo;

typedef t_nodo * t_lista   // lo que hago aca es declarar a "T_LISTA" como un t_nodo *

//FUNCIONES

int insertarenlista(t_lista *p,t_info *d)
{t_nodo *nue;
 nue=(t_nodo *)malloc(sizeof(t_nodo));
 if(!nue)
     return 0;  // sin memoria
 nue->sig= *p;
 nue->data= *d;
 *p = nue;
 return 1;     // todo bien
 }


int sacardelista(t_lista *p,t_info *d)
{t_lista aux;
 if(!p)
  return 0;   // si lista vacia devuelve 0
 aux=*p;
 *d=aux->data;
 *p=aux->sig;
 free(aux);
 return 1;        // todo bien
}

En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Listas enlazadas en c++
Programación C/C++
N3r0 3 7,902 Último mensaje 13 Julio 2010, 12:42 pm
por N3r0
Problema basico con listas en C « 1 2 »
Programación C/C++
HardForo 14 3,139 Último mensaje 14 Abril 2016, 21:51 pm
por MAFUS
AYUDA Problema con dos listas ordenadas C++
Programación C/C++
Kougami 7 1,967 Último mensaje 24 Abril 2017, 15:41 pm
por MAFUS
Problema programación listas.
Programación C/C++
Josh13 1 869 Último mensaje 21 Abril 2018, 19:25 pm
por MAFUS
Problema con las Listas C++
Programación C/C++
98Fran 3 1,204 Último mensaje 10 Septiembre 2019, 00:48 am
por RayR
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines