• Jueves 14 de Noviembre de 2024, 16:46

Autor Tema:  lista circular simple :3  (Leído 7442 veces)

yuikoheartless

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
lista circular simple :3
« en: Lunes 20 de Junio de 2011, 05:35 »
0
Hola a todos, bueno he leido el foro y me gustado bastante, este semestre estoy aprendiendo c++ y tengo que hacer una lista en c++ con punteros,la funcion de ingreso esta lista, tengo el algoritmo  de eliminacion pero aun no implementado y mi problema esta en la funcion mostrar (imprimir el contenido de la lista) segun mi logica deberia recorrer el puntero y mostrar el contenido hasta que llegue al ultimo pero bueno mi logica falla a veces  :P

  • en mi DA deje una imagen con la logica de los punteros aux y recorre, pero aun no puedo dejar enlaces
  • http//yuikoheartless.deviantart.com/gallery/#/d3jdlha


aqui el codigo :

Código: C++
  1.  
  2. #include <cstdlib>
  3. #include <iostream>
  4. //LISTA CIRCULAR
  5. using namespace std;
  6. struct listac{
  7.    int valor;
  8.    listac *sgte;
  9. };
  10.  
  11. bool vacia(listac *inicio){
  12.    bool v=false;
  13.    if(inicio==NULL)
  14.       v=true;
  15.    return v;
  16. }
  17.  
  18. void ingresar(listac *&inicio,listac *&ultimo){
  19.    cout<<"Ingrese un numero: ";
  20.    int numero;
  21.    listac *p;
  22.    p = new listac;
  23.    cin>>p->valor;  
  24.    cout<<endl;
  25.    if(vacia(inicio)==true){
  26.       inicio=p;
  27.       ultimo=p; }
  28.    else{
  29.        inicio->sgte=p;
  30.        p->sgte=inicio;
  31.        ultimo=p;
  32.    }
  33. }
  34.    
  35. void mostrar(listac *inicio,listac *ultimo){
  36.      listac *recorre , *aux;
  37.      recorre =  inicio;
  38.      aux = recorre->sgte;    
  39.      if(aux->sgte != inicio){
  40.           aux = recorre->sgte;
  41.           cout<<recorre->valor<<" ";
  42.           recorre=aux;
  43.      }
  44.  
  45. }  
  46.  
  47.  
  48. int main(int argc, char *argv[])
  49. {
  50.     listac *inicio,*ultimo;
  51.     inicio=ultimo=NULL;
  52.     for(int i=1;i<=5;i++){
  53.     ingresar(inicio,ultimo);}
  54.     mostrar(inicio,ultimo);
  55.     system("PAUSE");
  56.     return EXIT_SUCCESS;
  57. }
  58.  
  59.  
  60.  


Desde entonces muchas gracias

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: lista circular simple :3
« Respuesta #1 en: Lunes 20 de Junio de 2011, 06:57 »
0
Hola yuikoheartless, bueno, revise tu programa de manera rapida (aqui en mexico son las 11:30 pm, ya casi es hora de irme a dormir  :D ), y me parece que no lo estas haciendo de manera correcta. Yo diria que solo necesitas el apuntador del inicio de la lista circular, y no dos como estas manejando, (uno para el inicio y uno para el final), el apuntador al inicio es solo para tener un elemento desde donde poder comenzar a imprimir la lista, y saber donde detenernos pero bueno, como dije antes ya es tarde y no tengo mucho tiempo para revisar todo el programa.

En fin ya que dices que solo te falla el algoritmo mostrar, dire que te falta utilizar un ciclo para recorrer la lista, en tu funcion mostrar solo tienes un if, asi que por eso no puedes imprimir toda la lista. A continuacion te dejo la funcion de mostrar como pienso que deberia ser.

Ademas, al final te dejo 2 enlaces a la teoria de listas enlazadas y circulares, uno en ingles y el otro en español, esto para que le des una leida y te des una mejor idea de como debes implementarlo.

Código: C++
  1.  
  2. void mostrar(listac *inicio)
  3. {
  4.     listac *recorre;
  5.     if (inicio != NULL)
  6.     {
  7.         recorre =  inicio;
  8.         do {
  9.             cout << recorre->valor << " " << endl;
  10.             recorre = recorre->sgte;
  11.         } while (recorre != inicio);
  12.     }
  13. }  
  14.  
  15.  

http://en.wikipedia.org/wiki/Linked_list

http://c.conclase.net/edd/index.php?cap=004#inicio

Saludos y suerte :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

yuikoheartless

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: lista circular simple :3
« Respuesta #2 en: Martes 21 de Junio de 2011, 05:02 »
0
Profesor X, muchas gracias por el codigo ^^
lo extraño es que lo compile y ejecute, y hace lo mismo que el mio, solo muestra el 1 y el ultimo elemento ingresado  :comp:
saludos y grax ^^

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: lista circular simple :3
« Respuesta #3 en: Martes 21 de Junio de 2011, 07:16 »
0
Cita de: "yuikoheartless"
lo extraño es que lo compile y ejecute, y hace lo mismo que el mio

Ayer te comentaba que al parecer no lo estabas haciendo de manera correcta, ya que no tuve tiempo de revisarlo todo, hasta te dije que no necesitas el apuntador al ultimo, y ademas te deje enlaces para que los revisaras por ti mismo, pero al parecer hiciste caso omiso, si los hubieras revisado, hubieras comprobado que si, la insercion la haces mal, y al hacer la insercion mal, mostrara los datos mal.

Como consejo, debes ser un poco mas autodidacta, y si alguien te deja enlaces, revisalos, no solo esperes que te hagan el trabajo, no siempre habra gente que haga las cosas por ti.

Dicho eso, te dejo el codigo corregido como deberia ser, revisalo y analizalo. Espero que la siguiente vez si alguien te deja enlaces para leer, lo hagas y puedas corregir los errores por ti mismo.

Saludos :)

Código: C++
  1.  
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <iostream>
  7. //LISTA CIRCULAR
  8. using namespace std;
  9.  
  10. struct listac
  11. {
  12.     int valor;
  13.     listac *sgte;
  14. };
  15.  
  16. bool vacia(listac *inicio)
  17. {
  18.     bool v=false;
  19.     if(inicio==NULL)
  20.         v=true;
  21.     return v;
  22. }
  23.  
  24. void ingresar(listac **inicio)
  25. {
  26.     cout<<"Ingrese un numero: ";
  27.     listac *p;
  28.     p = new listac;
  29.     cin>>p->valor;  
  30.     cout<<endl;
  31.     if(vacia(*inicio)==true)
  32.     {
  33.         *inicio = p;
  34.     }
  35.     else
  36.     {
  37.         p->sgte = (*inicio)->sgte;
  38.     }
  39.     (*inicio)->sgte = p;
  40. }
  41.  
  42. void mostrar(listac *inicio)
  43. {
  44.     listac *recorre;
  45.     if (inicio != NULL)
  46.     {
  47.         recorre =  inicio;
  48.         do {
  49.             cout << recorre->valor << " " << endl;
  50.             recorre = recorre->sgte;
  51.         } while (recorre != inicio);
  52.     }
  53. }  
  54.  
  55. int main(int argc, char *argv[])
  56. {
  57.     listac *inicio;
  58.     inicio=NULL;
  59.     for(int i=1;i<=5;i++)
  60.     {
  61.         ingresar(&inicio);
  62.     }
  63.     mostrar(inicio);
  64.     system("PAUSE");
  65.     return EXIT_SUCCESS;
  66. }
  67.  
  68.  

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================