Foro de elhacker.net

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



Título: Invertir contenido de una lista enlazada simple con apuntadores
Publicado por: Beginner Web en 3 Septiembre 2018, 23:37 pm
Bueno la verdad no se porrque no me realiza el cambio para poder asi invertir la lista con el metodo burbuja y otra cosilla, si hay alguna otra forma de invertir la lista sin acudir a otra y respetando que es lista simplemente enlazada con 2 apuntadores estaria muy agradecid

Código
  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. using namespace std;
  6.  
  7. typedef struct tnodo *pnodo;
  8. typedef struct tnodo{
  9. char dato;
  10. pnodo sig;
  11. };
  12. typedef struct tlista{
  13. pnodo inicio;
  14. pnodo final;
  15. };
  16. char matrix[4][4]={{'a','b','c','d'},{'e','f','g','h'},{'i','j','k','l'},{'m','n','o','p'}};
  17.  
  18. void inicia(tlista &lista);
  19. void agregar_final(tlista &lista, pnodo nuevo);
  20. void copiarContenido(tlista &lista);
  21. void invertirLista(tlista &lista);
  22. void mostrar(tlista lista);
  23.  
  24. int main()
  25. {
  26. tlista milista;
  27. pnodo nuevonodo;
  28. int opcion, num;
  29. inicia(milista);
  30. do{
  31. system("cls");
  32. cout << "*MATRIZ*" << endl;
  33. for(int i=0;i<4;i++){
  34. for(int j=0;j<4;j++){
  35. cout << matrix[i][j] << " ";
  36. }
  37. cout << endl;
  38. }
  39. cout << "1. Iniciar lista" << endl;
  40. cout << "2. Copiar contenido de la matriz a la lista" << endl;
  41. cout << "3. Invertir el orden de la lista" << endl;
  42. cout << "4. Mostrar lista" << endl;
  43. cout << "5. Salir" << endl;
  44. cin >> opcion;
  45. switch(opcion){
  46. case 1: inicia(milista); break;
  47. case 2: copiarContenido(milista); break;
  48. case 3: invertirLista(milista); break;
  49. case 4: cout << "*** LISTA ***" << endl; mostrar(milista); break;
  50. case 5: cout << "FIN DEL  PROGRAMA" << endl; break;
  51. default: cout << "Opcion incorrecta" << endl;
  52. }
  53. system("pause");
  54. }while(opcion!=5);
  55. }
  56.  
  57. void inicia(tlista &lista)
  58. {
  59. lista.inicio=NULL;
  60. lista.final=NULL;
  61.  
  62. }
  63.  
  64. void agregar_final(tlista &lista, pnodo nuevo)
  65. {
  66. if(lista.inicio==NULL){
  67. lista.inicio=nuevo;
  68. lista.final=nuevo;
  69. }
  70. else{
  71. lista.final->sig=nuevo;
  72. lista.final=nuevo;
  73. }
  74. }
  75.  
  76. void copiarContenido(tlista &lista)
  77. {
  78. pnodo nuevo;
  79. for(int i=0;i<4;i++){
  80. for(int j=0;j<4;j++){
  81. nuevo=new tnodo;
  82. if(nuevo!=NULL){
  83. nuevo->dato=matrix[i][j];
  84. nuevo->sig=NULL;
  85. }
  86. else{
  87. cout << "MEMORIA INSUFICIENTE" << endl;
  88. }
  89. if(nuevo!=NULL){
  90. agregar_final(lista,nuevo);
  91. }
  92. }
  93. }
  94. }
  95.  
  96. void invertirLista(tlista &lista)
  97. {
  98. pnodo i, j;
  99. char buscado, aux;
  100. bool ordenado=true;
  101. buscado=lista.inicio->dato;
  102. while(ordenado){
  103. if(lista.inicio->dato==buscado){
  104. ordenado=false;
  105. }
  106. else{
  107. for(i=lista.inicio;i->sig!=NULL;i=i->sig){
  108. j=i->sig;
  109. aux=i->dato;
  110. i->dato=j->dato;
  111. j->dato=aux;
  112. }
  113. }
  114. }
  115. }
  116.  
  117. void mostrar(tlista lista)
  118. {
  119. pnodo i;
  120. if(lista.inicio!=NULL){
  121. for(i=lista.inicio;i!=NULL;i=i->sig){
  122. cout << "Nodo: " << i->dato << endl;
  123. }
  124. cout << endl;
  125. }
  126. else{
  127. cout << "LISTA VACIA" << endl;
  128. }
  129. }
  130.  

Y una ultiam cosilla, debo hacer otro modulo donde debo liberar el espacio de memoria de todos los nodos , al pareceer debo hacerlo nodo por nodo o liberar todo el espacio en memoria ocupado por la lista completea si alguien sabe ;)


Título: Re: Invertir contenido de una lista enlazada simple con apuntadores
Publicado por: MAFUS en 3 Septiembre 2018, 23:55 pm
¿Qué curso estás siguiendo?


Título: Re: Invertir contenido de una lista enlazada simple con apuntadores
Publicado por: Beginner Web en 4 Septiembre 2018, 00:13 am
Ninguno bro



Hola, miren he logrado invertir la lista utilizando otra auxiliar con este metodo pero no entiendo bien del todo como ocurre la magia si alguien me puede explicar
Código
  1. void invertirLista(tlista &lista)
  2. {
  3. pnodo aux;
  4. tlista secundaria;
  5. inicia(secundaria);
  6. if(lista.inicio!=NULL){
  7. while(lista.inicio!=NULL){
  8. aux=quitar_inicio(lista);
  9. agregar_inicio(secundaria,aux);
  10. }
  11. lista.inicio=secundaria.inicio;
  12. lista.final=secundaria.final;
  13. }
  14. else{
  15. cout << "LISTA VACIA" << endl;
  16. }
  17. }

Y este metodo lo he usado para liberar los nodos de la lista, en este solo diganme si esta bien nada mas, y si pueden hacerme saber como puede mostrar por pantalla por medio de un metodo o funcion interna que me diga cuanta memoria estoy ocupando , gracias

Código
  1. void liberar_memoria(tlista &lista)
  2. {
  3. pnodo borrado;
  4. while(lista.inicio!=NULL){
  5. borrado=lista.inicio;
  6. lista.inicio=lista.inicio->sig;
  7. delete(borrado);
  8. }
  9. }
;-)


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


Título: Re: Invertir contenido de una lista enlazada simple con apuntadores
Publicado por: MAFUS en 4 Septiembre 2018, 20:26 pm
Algo así debería devolverte en tamaño en bytes que ocupa la lista. No lo he probado.

Código
  1. size_t lista_memoria_usada(tlista &lista) {
  2.    size_t retval = 0;
  3.    pnodo aux = lista.inicio;
  4.  
  5.    while(aux) {
  6.        retval += sizeof(tlista);
  7.        aux = aux->sig;
  8.    }
  9.  
  10.    return retval;
  11. }


Título: Re: Invertir contenido de una lista enlazada simple con apuntadores
Publicado por: Beginner Web en 4 Septiembre 2018, 23:11 pm
 ;-)


Título: Re: Invertir contenido de una lista enlazada simple con apuntadores
Publicado por: CalgaryCorpus en 4 Septiembre 2018, 23:35 pm
Creo que hay que sumar sizeof(tnodo) por cada item en la lista + sizeof(tlista) para la cabeza de ella.