Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Beginner Web en 2 Septiembre 2018, 16:57 pm



Título: Modificacion del orden de una lista simplemente enlazada
Publicado por: Beginner Web en 2 Septiembre 2018, 16:57 pm
Hola, queria saber como puedo alterar el orden de una lista enlazada simple me piden lo siguiente, sin utilizar listas auxiliares, hacer una operacion donde los nodos se modifiquen segun espefica el usuario

LISTA ORIGINAL: LUNES->MARTES->MIERCOLES->JUEVES->VIERNES->SABADO->DOMINGO
Dia especificado por el usuario: JUEVES
LISTA MODIFICADA: JUEVES->VIERNES->SABADO->DOMINGO->LUNES->MARTES->MIERCOLES

He intentado ir agregando al final de la lista original los datos que son diferentes al dato especificado por el usuario y borrando el elemento inicial de la lista pero no tuve exito aca dejo el programa solo fijense en el modulo que se llama void modificar_lista(pnodo &lista)

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


Título: Re: Modificacion del orden de una lista simplemente enlazada
Publicado por: CalgaryCorpus en 2 Septiembre 2018, 17:39 pm
Que tal si haces una pasada para encontrar el elemento, el previo a este y el final de la lista?

Con eso tendrias:
- el primero
- uno antes del que buscas: prev
- el que buscas
- el ultimo

Luego haces que el previo apunte a null, que el ultimo apunte al inicio actual y que el inicio de la lista sea el que buscas




Título: Re: Modificacion del orden de una lista simplemente enlazada
Publicado por: Beginner Web en 2 Septiembre 2018, 21:47 pm
No, tiene que ser lista enlazada simple sin apuntadores y sin usar listas auxiliares, igual gracias


Título: Re: Modificacion del orden de una lista simplemente enlazada
Publicado por: MAFUS en 3 Septiembre 2018, 00:45 am
Pues buscas el nodo que el siguiente sea el dato buscado.
Haces que el inició de la lista apunte al siguiente dato.
Haces que el el final de la lista apunte a lo que era originalmente el inicio de la lista.
Haces que el nodo en el que estás apunte su siguiente a NULL.
Necesitarás alguna variable pnodo auxiliar.


Título: Re: Modificacion del orden de una lista simplemente enlazada
Publicado por: Beginner Web en 3 Septiembre 2018, 01:57 am
Use un bubble_sort sobre la lista fue mas facil

Código
  1. void modificar_lista(pnodo &lista)
  2. {
  3. pnodo i, j;
  4. tcad buscado, aux;
  5. bool ordenado=true;
  6. cout << "Ingrese dia de la semana: "; cin >> buscado;
  7. while(ordenado){
  8. if(strcmp(lista->dato,buscado)==0){
  9. ordenado=false;
  10. }
  11. else{
  12. for(i=lista;i->sig!=NULL;i=i->sig){
  13. j=i->sig;
  14. strcpy(aux,i->dato);
  15. strcpy(i->dato,j->dato);
  16. strcpy(j->dato,aux);
  17. }
  18. }
  19. }
  20. }