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)
| | |-+  Pequeña duda sobre listas circulares simples
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Pequeña duda sobre listas circulares simples  (Leído 1,821 veces)
Beginner Web


Desconectado Desconectado

Mensajes: 634


youtu.be/0YhflLRE-DA


Ver Perfil
Pequeña duda sobre listas circulares simples
« en: 3 Septiembre 2018, 21:26 pm »

Hola chavales, queria que me dijeran que estoy haciendo mal en este programa, deseo eliminar el ultimo nodo de la lsita circular y creo, creo que mi error esta en no declarar bien los apuntadores de inicio y final de la lista y el metodo de borrar ultimo nodo tambien me falla al parecer  :huh:

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. typedef struct tnodo *pnodo;
  7. typedef struct tnodo{
  8. int dato;
  9. pnodo sig;
  10. };
  11. typedef struct tlista{
  12. pnodo inicio;
  13. pnodo final;
  14. int contador;
  15. };
  16. void inicia(tlista &lista);
  17. void crear(pnodo &nuevo);
  18. void agregar_inicio(tlista &lista, pnodo nuevo);
  19. pnodo quitar_final(tlista &lista);
  20. void mostrar(tlista lista);
  21.  
  22. int main()
  23. {
  24. tlista milista;
  25. pnodo nuevonodo, eliminado;
  26. int opcion, num;
  27. inicia(milista);
  28. do{
  29. system("cls");
  30. cout << "1. Iniciar lista" << endl;
  31. cout << "2. Agregar al inicio" << endl;
  32. cout << "3. Quitar al final" << endl;
  33. cout << "4. Mostrar lista" << endl;
  34. cout << "5. Salir" << endl;
  35. cin >> opcion;
  36. switch(opcion){
  37. case 1: inicia(milista); break;
  38. case 2: crear(nuevonodo); if(nuevonodo!=NULL){agregar_inicio(milista,nuevonodo);}; break;
  39. case 3: eliminado=quitar_final(milista); if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl;}break;
  40. case 4: cout << "*** LISTA ***" << endl; mostrar(milista); break;
  41. case 5: cout << "FIN DEL  PROGRAMA" << endl; break;
  42. default: cout << "Opcion incorrecta" << endl;
  43. }
  44. system("pause");
  45. }while(opcion!=5);
  46. }
  47.  
  48. void inicia(tlista &lista)
  49. {
  50. lista.inicio=NULL;
  51. lista.final=NULL;
  52. lista.contador=0;
  53. }
  54.  
  55. void crear(pnodo &nuevo)
  56. {
  57. nuevo=new tnodo;
  58. if(nuevo!=NULL){
  59. cout << "Ingrese valor: "; cin >> nuevo->dato;
  60. nuevo->sig=NULL;
  61.  
  62. }
  63. else{
  64. cout << "MEMORIA INSUFICIENTE" << endl;
  65. }
  66. }
  67.  
  68. void agregar_inicio(tlista &lista, pnodo nuevo)
  69. {
  70. if(lista.inicio==NULL){
  71. lista.inicio=nuevo;
  72. lista.final=nuevo;
  73. }
  74. else{
  75. nuevo->sig=lista.inicio;
  76. lista.inicio=nuevo;
  77. }
  78. lista.contador++;
  79. }
  80.  
  81. pnodo quitar_final(tlista &lista)
  82. {
  83. pnodo borrado, i;
  84. if(lista.inicio==NULL){
  85. borrado=NULL;
  86. }
  87. else{
  88. if(lista.inicio==lista.final){
  89. borrado=lista.inicio;
  90. lista.inicio=NULL;
  91. lista.final=NULL;
  92. }
  93. else{
  94. for(i=lista.inicio;(i->sig)->sig!=lista.final->sig;i=i->sig)
  95. borrado=lista.final;
  96. lista.final=i;
  97. lista.final->sig=lista.inicio;
  98. }
  99. lista.contador--;
  100. }
  101. return borrado;
  102. }
  103.  
  104. void mostrar(tlista lista)
  105. {
  106. pnodo i;
  107. if(lista.inicio!=NULL){
  108. for(i=lista.inicio;i!=lista.final->sig;i=i->sig){
  109. cout << "Nodo: " << i->dato << endl;
  110. }
  111. cout << endl;
  112. cout << "Cantidad de elementos: " << lista.contador << endl;
  113. }
  114. else{
  115. cout << "LISTA VACIA" << endl;
  116. }
  117. }
  118.  



Me he quemado la cabeza tratando de eliminar el ultimo elemento de la lista circular la logica la tengo pero no se como programarlo  :huh:
Y al mostrar lista queria hacerlo con un for pero tampoco pude asi que use un do{}while(); Si alguien sabe codificacion en C++ me dice como es la cosa con borrar ultimo elemento de la lista circular , no hace falta que me explique de logica, muchas gracias  ;-)

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. typedef struct tnodo *pnodo;
  7. typedef struct tnodo{
  8. int dato;
  9. pnodo sig;
  10. };
  11. typedef struct tlista{
  12. pnodo inicio;
  13. pnodo final;
  14. int contador;
  15. };
  16. void inicia(tlista &lista);
  17. void crear(pnodo &nuevo);
  18. void agregar_inicio(tlista &lista, pnodo nuevo);
  19. pnodo quitar_final(tlista &lista);
  20. void mostrar(tlista lista);
  21.  
  22. int main()
  23. {
  24. tlista milista;
  25. pnodo nuevonodo, eliminado;
  26. int opcion, num;
  27. inicia(milista);
  28. do{
  29. system("cls");
  30. cout << "1. Iniciar lista" << endl;
  31. cout << "2. Agregar al inicio" << endl;
  32. cout << "3. Quitar al final" << endl;
  33. cout << "4. Mostrar lista" << endl;
  34. cout << "5. Salir" << endl;
  35. cin >> opcion;
  36. switch(opcion){
  37. case 1: inicia(milista); break;
  38. case 2: crear(nuevonodo); if(nuevonodo!=NULL){agregar_inicio(milista,nuevonodo);}; break;
  39. case 3: eliminado=quitar_final(milista);if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl; delete(eliminado);}; break;
  40. case 4: cout << "*** LISTA ***" << endl; mostrar(milista); break;
  41. case 5: cout << "FIN DEL  PROGRAMA" << endl; break;
  42. default: cout << "Opcion incorrecta" << endl;
  43. }
  44. system("pause");
  45. }while(opcion!=5);
  46. }
  47.  
  48. void inicia(tlista &lista)
  49. {
  50. lista.inicio=NULL;
  51. lista.final=NULL;
  52. lista.contador=0;
  53. }
  54.  
  55. void crear(pnodo &nuevo)
  56. {
  57. nuevo=new tnodo;
  58. if(nuevo!=NULL){
  59. cout << "Ingrese valor: "; cin >> nuevo->dato;
  60. nuevo->sig=NULL;
  61.  
  62. }
  63. else{
  64. cout << "MEMORIA INSUFICIENTE" << endl;
  65. }
  66. }
  67.  
  68. void agregar_inicio(tlista &lista, pnodo nuevo)
  69. {
  70. if(lista.inicio==NULL){
  71. lista.inicio=nuevo;
  72. lista.final=nuevo;
  73. lista.final->sig=lista.inicio;
  74. }
  75. else{
  76. lista.final->sig=nuevo;
  77. nuevo->sig=lista.inicio;
  78. lista.inicio=nuevo;
  79. }
  80. lista.contador++;
  81. }
  82.  
  83. pnodo quitar_final(tlista &lista)
  84. {
  85. pnodo borrado, i;
  86. if(lista.inicio==NULL){
  87. borrado=NULL;
  88. }
  89. else{
  90. if(lista.inicio==lista.final){
  91. borrado=lista.inicio;
  92. lista.inicio=NULL;
  93. lista.final=NULL;
  94. }
  95. else{
  96. for(i=lista.inicio;i!=lista.final;i=i->sig);
  97. borrado=lista.final;
  98. i->sig=lista.inicio;
  99. lista.final=i;
  100. }
  101. lista.contador--;
  102. }
  103. return borrado;
  104. }
  105.  
  106. void mostrar(tlista lista)
  107. {
  108. pnodo i;
  109. bool seguir=true;
  110. if(lista.inicio!=NULL){
  111. i=lista.inicio;
  112. while(seguir){
  113. cout << "Nodo: " << i->dato << endl;
  114. if(i==lista.final){
  115. seguir=false;
  116. }
  117. i=i->sig;
  118. }
  119. }
  120. else{
  121. cout << "LISTA VACIA" << endl;
  122. }
  123. }
  124.  



Chicos lo acabo de resolver miren, porque nadie me lo dijo antes?

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3.  
  4. using namespace std;
  5.  
  6. typedef struct tnodo *pnodo;
  7. typedef struct tnodo{
  8. int dato;
  9. pnodo sig;
  10. };
  11. typedef struct tlista{
  12. pnodo inicio;
  13. pnodo final;
  14. int contador;
  15. };
  16. void inicia(tlista &lista);
  17. void crear(pnodo &nuevo);
  18. void agregar_inicio(tlista &lista, pnodo nuevo);
  19. pnodo quitar_final(tlista &lista);
  20. void mostrar(tlista lista);
  21.  
  22. int main()
  23. {
  24. tlista milista;
  25. pnodo nuevonodo, eliminado;
  26. int opcion, num;
  27. inicia(milista);
  28. do{
  29. system("cls");
  30. cout << "1. Iniciar lista" << endl;
  31. cout << "2. Agregar al inicio" << endl;
  32. cout << "3. Quitar al final" << endl;
  33. cout << "4. Mostrar lista" << endl;
  34. cout << "5. Salir" << endl;
  35. cin >> opcion;
  36. switch(opcion){
  37. case 1: inicia(milista); break;
  38. case 2: crear(nuevonodo); if(nuevonodo!=NULL){agregar_inicio(milista,nuevonodo);}; break;
  39. case 3: eliminado=quitar_final(milista);if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl; delete(eliminado);}; break;
  40. case 4: cout << "*** LISTA ***" << endl; mostrar(milista); break;
  41. case 5: cout << "FIN DEL  PROGRAMA" << endl; break;
  42. default: cout << "Opcion incorrecta" << endl;
  43. }
  44. system("pause");
  45. }while(opcion!=5);
  46. }
  47.  
  48. void inicia(tlista &lista)
  49. {
  50. lista.inicio=NULL;
  51. lista.final=NULL;
  52. lista.contador=0;
  53. }
  54.  
  55. void crear(pnodo &nuevo)
  56. {
  57. nuevo=new tnodo;
  58. if(nuevo!=NULL){
  59. cout << "Ingrese valor: "; cin >> nuevo->dato;
  60. nuevo->sig=NULL;
  61. }
  62. else{
  63. cout << "MEMORIA INSUFICIENTE" << endl;
  64. }
  65. }
  66.  
  67. void agregar_inicio(tlista &lista, pnodo nuevo)
  68. {
  69. if(lista.inicio==NULL){
  70. lista.inicio=nuevo;
  71. lista.final=nuevo;
  72. nuevo->sig=nuevo;//Hasta aca se que esta bien;
  73. }
  74. else{
  75. lista.final->sig=nuevo;
  76. nuevo->sig=lista.inicio;
  77. lista.inicio=nuevo;
  78. }
  79. lista.contador++;
  80. }
  81.  
  82. pnodo quitar_final(tlista &lista)
  83. {
  84. pnodo borrado, i;
  85. if(lista.inicio==NULL){
  86. borrado=NULL;
  87. }
  88. else{
  89. if(lista.inicio==lista.final){
  90. borrado=lista.inicio;
  91. lista.inicio=NULL;
  92. lista.final=NULL;
  93. }
  94. else{
  95. for(i=lista.inicio;(i->sig)->sig!=lista.inicio;i=i->sig);
  96. borrado=lista.final;
  97. lista.final=i;
  98. lista.final->sig=lista.inicio;
  99. }
  100. lista.contador--;
  101. }
  102. return borrado;
  103. }
  104.  
  105. void mostrar(tlista lista)
  106. {
  107. pnodo i;
  108. bool seguir=true;
  109. if(lista.inicio!=NULL){
  110. i=lista.inicio;
  111. while(seguir){
  112. cout << "Nodo: " << i->dato << endl;
  113. if(i==lista.final){
  114. seguir=false;
  115. }
  116. i=i->sig;
  117. }
  118. }
  119. else{
  120. cout << "LISTA VACIA" << endl;
  121. }
  122. }
  123.  



Mod: Prohibido el doble o triple post. Usa el botón "Modificar".


« Última modificación: 16 Septiembre 2018, 01:42 am por #!drvy » En línea

7w7
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda Acerca De Listas y Listas Circulares (Revienta Memoria :S)
Programación C/C++
Gerik 0 5,973 Último mensaje 12 Septiembre 2010, 01:49 am
por Gerik
Algortimos de euclides usando listas circulares
Programación C/C++
imperio7 3 2,133 Último mensaje 22 Septiembre 2013, 08:53 am
por eferion
listas enlazadas simples
Programación C/C++
dmon1 8 3,672 Último mensaje 15 Abril 2015, 05:00 am
por dmon1
Una pregunta acerca de mostrar listas circulares
Programación C/C++
Beginner Web 1 4,353 Último mensaje 13 Septiembre 2018, 16:58 pm
por jca1
Dudas sobre el ordenamiento burbuja en listas simples
Programación C/C++
Beginner Web 2 2,165 Último mensaje 12 Diciembre 2018, 05:52 am
por Beginner Web
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines