Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Beginner Web en 3 Septiembre 2018, 21:26 pm



Título: Pequeña duda sobre listas circulares simples
Publicado por: Beginner Web 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".