Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Error en una lista dinamica simple

Estas en el tema de Error en una lista dinamica simple en el foro de C/C++ en Foros del Web. Buenas noches comunidad de forosweb, como siempre buscando de su buena ayuda, soy novato en c, y ando aprendiendo como trabajan las listas enlazadas, estoy ...
  #1 (permalink)  
Antiguo 27/04/2014, 19:57
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 3 meses
Puntos: 0
Error en una lista dinamica simple

Buenas noches comunidad de forosweb, como siempre buscando de su buena ayuda, soy novato en c, y ando aprendiendo como trabajan las listas enlazadas, estoy haciendo una lista enlazada que guarde x cantidad de valores, y posteriormente los despliegue por pantalla, el codigo compila y ejecuta, sin embargo el problema comienza cuando se agregan mas de 6 numeros enteros, en el momento de imprimir, muestra correctamente algunos datos e imprime basura dejo acontinuación el codigo y impresiones de pantalla.





y este es el codigo gracias de antemano

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. main()
  5. {
  6. int *lista,i=0,r;
  7. puts("Lista enlazada");
  8.  
  9. lista=(int *) malloc(sizeof(int));
  10.  
  11. printf("\nElemento %d de la lista enlazada",i+1);
  12. scanf("%d",&*(lista));
  13. system("cls");
  14.         puts("Desea agregar otro elemento");
  15.         scanf("%d",&r);
  16.             while(r==1)
  17.             {
  18.                 i++;
  19.                 realloc(lista,i+1*sizeof(int));
  20.                 printf("Elemento %d de la lista enlazada",i+1);
  21.                 scanf("%d",&*(lista+i));
  22.                 system("cls");
  23.                         puts("Desea agregar otro elemento");
  24.         scanf("%d",&r);
  25.                
  26.             }
  27.    
  28.     for(int x=0;x<i+1;x++)
  29.     {
  30.     printf("%d ",lista[x]);
  31.    
  32.     }
  33.    
  34.     free(lista);
  35. }
  #2 (permalink)  
Antiguo 27/04/2014, 23:52
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 2 meses
Puntos: 5
Respuesta: Error en una lista dinamica simple

hola TriN.
bueno tu error es qu eno asignabas suficiente memoria por eso te salia ese error nosepor que la asignaste asi pero yo trato de asignar la memoria completa la que se piensa usar o tambien lo podias haber escho pidiendo que cantidadde memria se queria asignar alomejor asi ya no ibas a tener problemas y bueno espero que aun te sirva la respuesta aqui te dejo el codigo.


Código C:
Ver original
  1. #include <stdio.h>
  2.     #include <stdlib.h>
  3.      
  4.     int main()
  5.     {
  6.     int *lista, i, r, x;
  7.     lista = NULL;
  8.     i=0;
  9.     r = 0;
  10.     x = 0;
  11.     puts("Lista enlazada");
  12.      
  13.     lista = (int *) malloc( sizeof(int) );
  14.     if (lista == NULL)
  15.             printf("error al reservar memoria\n");
  16.      
  17.     printf("\nElemento %d de la lista enlazada",i+1);
  18.     scanf("%d",&lista[i]);
  19.    
  20.     system("clear");
  21.     puts("Desea agregar otro elemento");
  22.      scanf("%d",&r);
  23.  
  24.                 while(r == 1)
  25.                 {
  26.                     i++;
  27.                     r = 0;
  28.                     lista = (int*) realloc(lista,20 *sizeof(int));
  29.  
  30.             if (lista == NULL )
  31.                 printf("no se puedo asignar memoria");
  32.  
  33.                     printf("Elemento %d de la lista enlazada\n",i+1);
  34.                     scanf("%d",&lista[i]);
  35.  
  36.                     puts("Desea agregar otro elemento\n");
  37.                     scanf("%d",&r);
  38.                    
  39.                 }
  40.        
  41.         for(x=0;x<i+1;x++)
  42.         {
  43.         printf("%d\n",lista[x]);
  44.        
  45.         }
  46.        
  47.         free(lista);
  48.     return 0;
  49.     }
espero que te sirva saludos drewermerc.
  #3 (permalink)  
Antiguo 28/04/2014, 08:49
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Error en una lista dinamica simple

Hola Drewermerc gracias por tu respuesta, y asignaba la memoria asi por que pense que por cada vez que se repitiera el ciclo while se agregaria un espacio mas de memoria, tengo una pregunta que hacerte, tu codigo funciona bien pero como veo cada vez que se repite el ciclo While, asignas 20 espacios de memoria tipo int cierto? cuando solo se requiere 1 para el nuevo elemento, en tu linea 28:
Código C:
Ver original
  1. lista = (int*) realloc(lista,20 *sizeof(int));

Es decir solo quiero que me genere la memoria necesaria.
  #4 (permalink)  
Antiguo 28/04/2014, 14:10
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 11 años, 11 meses
Puntos: 49
Respuesta: Error en una lista dinamica simple

Cita:
Iniciado por TriN Ver Mensaje
........................................
Es decir solo quiero que me genere la memoria necesaria.
Entonces esto te valdrá, perdona que halla quitado los cls y demás:

Código C++:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(){
  5. int *lista= NULL,i=0,x,num;
  6. puts("Lista enlazada");
  7.  
  8.   do {
  9.     printf("\nElemento %d de la lista enlazada (0 para salir): ",i+1);
  10.     scanf ("%d", &num);
  11.     i++;
  12.  
  13.     lista =realloc(lista,(i)*sizeof(int));
  14.  
  15.     if (lista !=NULL)
  16.       *(lista+i-1)=num;
  17.  
  18.     else {
  19.        free (lista);
  20.        puts ("Error (re)allocating memoria");
  21.        return 1;
  22.      }
  23.   }while (num!=0);
  24.  
  25.     for( x=0;x<i-1;x++)
  26.       printf("%d ",lista[x]);
  27.     free(lista);
  28.     return 0;
  29. }


¡¡¡Saluditos!!!

  #5 (permalink)  
Antiguo 28/04/2014, 16:06
 
Fecha de Ingreso: junio-2008
Ubicación: Seattle, USA
Mensajes: 733
Antigüedad: 15 años, 10 meses
Puntos: 61
Respuesta: Error en una lista dinamica simple

¿Por que le llamas lista dinamica?

La idea genérica de la lista se "aterriza" al usar una struct, en donde guardas el dato y la direccion de memoria del siguiente elemento. Cuando se hace necesario, pides memoria para 1 mas y lo guardas en el anterior.

Claro, un arreglo tiene la gracia que no requieres pedir memoria para el siguiente y enlazar porque el siguiente siempre es el de "adelante" en el arreglo. Si buscas simplicidad, el arreglo es la opcion. Lo malo es que tienes que andar pidiendo un monton a la vez y si se te acaba, ahi va otro monton. O bien andar copiando de una zona de memoria a otra a cada rato.

Si quieres optimización de memoria y uso racional de ella, pedir solo lo necesario, usando la lista al estilo "struct con datos + direccion del siguiente" deberia ser tu opcion.

Sugiero hagas google a "implementacion de lista enlazada en C" y elijas entre los miles de implementaciones que mirar.
__________________
Visita mi perfil en LinkedIn
  #6 (permalink)  
Antiguo 28/04/2014, 19:36
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 2 meses
Puntos: 5
Respuesta: Error en una lista dinamica simple

hola a todos.
bueno TriN si tienes razon y al memoria se asigna ese numeor cada vez que se repite el bucle.
bueno pues leosansan ya te dio la respuesta es un buen metodo a decir verdad yo no me sabia ese metodo de implementa memoria dinamica ya que no llevo mucho con memoria dinamica.

hola leosansan bueno tengo unas dudas bueno pues yo no sabia que que realloc se podia usar solo, y bueno queria saber si es metodo es igual de efectivo que usar malloc y realloc juntos.

y tambien queria saber por que si guardo datos usando scanf al imprimir los valores me resultados erroneos asi.

Código C:
Ver original
  1. Lista enlazada
  2. Elemento 1 de la lista enlazada (0 para salir): 5
  3. Elemento 2 de la lista enlazada (0 para salir): 5
  4. Elemento 3 de la lista enlazada (0 para salir): 5
  5. Elemento 4 de la lista enlazada (0 para salir): 5
  6. Elemento 5 de la lista enlazada (0 para salir): 0
  7. 0 0 0 135153

y bueno una ultima duda por que veo que la malloria usa

Código C:
Ver original
  1. *(lista+i-1)=num;
  2. &*(lista)

este tipo para acceder a datos de la memoria o guardar datos en ella yo por regular uso mas este metodo.

Código C:
Ver original
  1. lista[i+1];
  2. &lista[i];

que funciona igual nose si algun metodo es es el correcto o los dos son corecto y es como cadaquien se acomode a programar.

hola CalgaryCorpus.
ese tema no lo conocia lo voy a checar gracias por la informacion.
bueno espero que me contesten mis dudas.

Última edición por Drewermerc; 28/04/2014 a las 20:15
  #7 (permalink)  
Antiguo 28/04/2014, 21:06
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 3 meses
Puntos: 0
Respuesta: Error en una lista dinamica simple

Hola de nuevo gracias por sus respuestas he despejado dudas, ademas de generar otras dudas jeje, y si Calgary tienes razon en lo que dices

Cita:
¿Por que le llamas lista dinamica?
Me di cuenta un poco tarde que no es una lista y seguire tu consejo buscare información respecto a ello, por otro lado me interesa poseer conocimiento sobre la utilizacion de la memoria de manera eficiente, el codigo que realizo leosansan es realmente lo que necesitaba sin embargo tengo la misma duda que el compañero Drewermerc se puede usar la función realloc independiente sin usar la función calloc o malloc?, y otra pregunta por que al ejecutar el codigo inicial que coloque funciona hasta que el puntero posee mas de 6 elementos si estoy haciendo un realloc de memoria? Gracias de antemano compañeros.
  #8 (permalink)  
Antiguo 28/04/2014, 21:25
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 2 meses
Puntos: 5
Respuesta: Error en una lista dinamica simple

hola trin.
bueno con la ayuda del codigo que hizo leosansan pude solucionar tu error y la verdad aun no se bien por que pero solo por entre parentesis (i+1) y tu programa ya corre bien si quieres pruebalo ami si me funcion solo con cambiar eso y bueno esperemos habr si tambien nos contestan esta duda.
la verdad yo pense que la memoria dinamica no tenia mcuho uso peor ahora veo que te ayuda a manejar mucho mejor la memoria.
con lo que me surgui otra duda si se puede trabar la memoria dinamica y manejar como matrizes, arrays etc. entonces cual seriamas conveniente usar memoria dinamica o las otras opciones o depende del programa que se desallorre.

Etiquetas: dinamica, int, lista, numero, simple
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:03.