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

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Invertir una Lista en C - La funcion Pop no me da el ultimo elemento.?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Invertir una Lista en C - La funcion Pop no me da el ultimo elemento.?  (Leído 3,609 veces)
palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Invertir una Lista en C - La funcion Pop no me da el ultimo elemento.?
« en: 26 Octubre 2016, 01:09 am »

Hola

Estoy haciendo un programa en el cual tengo que agregar elementos a una lista, luego imprimir la lista y luego crear otra lista en el cual se rellene con los valores de la lista anterior de manera invertida.
El ejercicio parece simple. El problema es que yo uso la funcion pop, que tengo entendido que retorna el ultimo valor de la lista y no me esta retornando el ultimo elemento, sino que primero retorna el primero, luego el segundo y asi...
Dejo mi codigo, supongo que sera algo muy facil pero no le encuentro el defecto a las funciones que programe.

Código
  1. /*Ejercicio 5.6
  2. Programar una función que invierta una lista de enteros. Considere que la lista puede estar vacía*/
  3.  
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <conio.h>
  7.  
  8. struct s_nodo
  9. {
  10.    int valor;
  11.    struct s_nodo*sig;
  12. };
  13. typedef struct s_nodo *t_nodo;
  14.  
  15. void agregar(t_nodo*,int);
  16. void imprimirLista(t_nodo);
  17. void invertirLista(t_nodo*,t_nodo*);
  18. int pop(t_nodo*);
  19.  
  20. int main()
  21. {
  22.    t_nodo lista=NULL;
  23.    t_nodo inversa=NULL;
  24.    agregar(&lista,1);
  25.    agregar(&lista,3);
  26.    agregar(&lista,5);
  27.    agregar(&lista,7);
  28.    printf("\nLista impresa = ");
  29.    imprimirLista(lista);
  30.    invertirLista(&lista,&inversa);
  31.    printf("\nLista inversa = ");
  32.    imprimirLista(inversa);
  33.    return 0;
  34. }
  35.  
  36. void agregar(t_nodo* nodo,int valor)
  37. {
  38.    if(*nodo==NULL)
  39.    {
  40.        *nodo=(t_nodo)malloc(sizeof(struct s_nodo));
  41.        if(*nodo==NULL)
  42.            return;
  43.        (*nodo)->valor=valor;
  44.        (*nodo)->sig=NULL;
  45.    }
  46.    else
  47.        agregar(&((*nodo)->sig),valor);
  48. }
  49.  
  50. void imprimirLista(t_nodo lista)
  51. {
  52.    while(lista!=NULL)
  53.    {
  54.        printf(" %d  ",lista->valor);
  55.        lista=lista->sig;
  56.    }
  57. }
  58.  
  59. void invertirLista(t_nodo *lista,t_nodo* inversa)
  60. {
  61.    int valor;
  62.    while(*lista!=NULL)
  63.    {
  64.        valor=pop(lista);
  65.        agregar(inversa,valor);
  66.    }
  67. }
  68.  
  69. int pop(t_nodo* nodo)
  70. {
  71.    t_nodo aux=*nodo;
  72.    int valor=aux->valor;
  73.    *nodo=aux->sig;
  74.    free(aux);
  75.    return valor;
  76. }


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Invertir una Lista en C - La funcion Pop no me da el ultimo elemento.?
« Respuesta #1 en: 26 Octubre 2016, 19:44 pm »

El problema es que tu lista crece por el final pero quitas por el principio.


En línea

palacio29

Desconectado Desconectado

Mensajes: 103


Ver Perfil
Re: Invertir una Lista en C - La funcion Pop no me da el ultimo elemento.?
« Respuesta #2 en: 27 Octubre 2016, 00:20 am »

El problema es que tu lista crece por el final pero quitas por el principio.

Y como puedo hacer que el POP tome el ultimo elemento?

Si mi lista es 3 - 5 -7 -9

Yo quiero sacar el 9, luego el 7, luego el 5 y asi sucesivamente pero nose como empezar desde  el final e ir para el principio, solo se ir desde el comienzo hasta el final.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Invertir una Lista en C - La funcion Pop no me da el ultimo elemento.?
« Respuesta #3 en: 27 Octubre 2016, 01:01 am »

Tendrías que mirar si (*nodo)->sig->sig vale NULL para sacar el valor de (*nodo)->sig->valor. Después hacer un free sobre (*nodo)->sig para terminar llevando a NULL (*nodo)->sig. Como puedes ver es muy complicado.

Te sería mucho más fácil cambiar la función agregar para hacer de tu lista una pila. El último objeto que entres debe estar en cabeza. Tu función pop quedaría tal y como la tienes. Para tu función agregar (por conveniencia sería mejor que la llamaras push):
La función debe recibir un puntero a la lista y el valor a añadir.
Dentro: creas una variable auxiliar de tipo nodo. Como valor le das el valor que te han pasado a la función. Como siguiente elemento apuntas a la lista.
Haces que la raíz de la lista que te han pasado como argumento apunte al nodo auxiliar.
Listo, ya tienes tu programa funcional.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines