Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: BJM en 13 Diciembre 2012, 14:11 pm



Título: Problema con lista simplemente encadenada
Publicado por: BJM en 13 Diciembre 2012, 14:11 pm
El siguiente programa debe crear una lista de los primeros 100 numeros pares  y luego mostrar la suma total de todos los numeros, el problema es que no se esta imprmiendo nada en pantalla.

Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. typedef struct punt{
  5.        int dato;
  6.        struct punt *sig;
  7.        }nodo;
  8.  
  9.      typedef nodo *pt;
  10.  
  11.  
  12. void insertar(pt *lista, int i);
  13. void suma(pt *lista);
  14. void mostrar(pt *lista);
  15.  
  16.  
  17. main(){
  18.      int i;
  19.       pt lista=NULL;
  20.         for(i=1;i<=200;i++){
  21.       insertar(&lista,i);
  22.       }
  23.       suma(&lista);
  24.       mostrar(&lista);
  25.  
  26.       system("pause");
  27.       }
  28.  
  29. void insertar(pt *lista, int i){
  30.  
  31.     pt nuevo,ultimo;
  32.     nuevo=(pt)malloc(sizeof(nodo));
  33.  
  34.       do{    
  35.            nuevo->dato=i;        
  36.            if(*lista==NULL){
  37.             nuevo->sig=NULL;
  38.             *lista=nuevo;                    
  39.             }
  40.             else{
  41.                  ultimo=*lista;
  42.                  if(lista!=NULL){
  43.                  while(ultimo->sig!=NULL){
  44.                  ultimo=ultimo->sig;
  45.                  }// cierre while
  46.                  nuevo->sig=NULL;
  47.                  ultimo->sig=nuevo;
  48.                  }// cierre if
  49.                  }// cierre else
  50.              }while(i%2==0);
  51.  
  52.                    }// cierre funcion
  53.  
  54. void suma(pt *lista){
  55.     int total=0;
  56.     pt aux;
  57.     if(*lista!=NULL){
  58.       aux=*lista;              
  59.     do{
  60.     total+=aux->dato;
  61.     aux=aux->sig;
  62.     }while(aux->sig!=NULL);
  63.     }//cierre if
  64.     printf("\n\n Total de la lista: %d",total);
  65.     }//cierre funcion
  66.  
  67. void mostrar(pt *lista){
  68.     pt aux=*lista;
  69.     if(*lista!=NULL){
  70.     while(aux!=NULL){
  71.     printf("\n\n Valores pares : %d\t",aux->dato);
  72.     aux=aux->sig;
  73.     }//cierre while
  74.     }//cierre if
  75.     }//cierre funcion
  76.  


Título: Re: Problema con lista simplemente encadenada
Publicado por: durasno en 13 Diciembre 2012, 15:19 pm
Hola! el problema esta en la funcion insertar(), el do-while esta demas(no es necesario), ademas con esa condicion estas creando un bucle infinito cuando el numero es par... Si queres crear una lista con numeros pares la condicion principal debe ser:
Código
  1. if(i%2==0) {
  2.  
  3. ...... /* crear lista */
  4.  
  5. }

Otra cosa:
Código
  1. if(lista!=NULL)
esta condicion no es necesario, ya que una vez ingresado al else la lista siempre va a ser distinto de NULL


Saludos


Título: Re: Problema con lista simplemente encadenada
Publicado por: BJM en 14 Diciembre 2012, 13:52 pm
Ahora si funciona correctamente, gracias.


Título: Re: Problema con lista simplemente encadenada
Publicado por: twins en 14 Diciembre 2012, 23:19 pm
Hola pruebalo ahora hice unas correcciones pequeñas solamente saludos  ;D
Código
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. typedef struct punt{
  4. int dato;
  5. struct punt *sig;
  6. }nodo;
  7. void insertar(nodo **lista,int i);
  8. void suma(nodo **lista);
  9. void mostrar(nodo **lista);
  10. int main(void){
  11. int i;
  12. nodo *lista=NULL;
  13. for(i=1;i<=100;i++){
  14. if(i%2==0)
  15. insertar(&lista,i);
  16. }
  17. mostrar(&lista);
  18. suma(&lista);
  19. system("pause");
  20. return(0);
  21. }
  22. void insertar(nodo **lista, int i){
  23. nodo *nuevo,*ultimo;
  24. nuevo=(nodo*)malloc(sizeof(nodo));
  25. nuevo->dato=i;        
  26. if(*lista==NULL){
  27. nuevo->sig=NULL;
  28. *lista=nuevo;                    
  29. }else{
  30. ultimo=*lista;
  31. while(ultimo->sig!=NULL)
  32. ultimo=ultimo->sig;
  33.    // cierre while
  34. ultimo->sig=nuevo;
  35. nuevo->sig=NULL;
  36. // cierre if
  37. }// cierre else
  38. }// cierre funcion
  39. void suma(nodo **lista){
  40. int total=0;
  41. nodo *aux;
  42. if(*lista!=NULL){
  43. aux=*lista;              
  44.        while(aux->sig!=NULL){
  45. total+=aux->dato;
  46.            aux=aux->sig;
  47.    }
  48. }//cierre if
  49. printf("\nTotal de la lista: %d\n",total);
  50. }//cierre funcion
  51. void mostrar(nodo **lista){
  52. nodo *aux=*lista;
  53. if(*lista!=NULL){
  54. while(aux!=NULL){
  55. printf("[%d]\n",aux->dato);
  56. aux=aux->sig;
  57.    }//cierre while
  58. }//cierre if
  59. }//cierre funcion
  60.