• Sábado 14 de Diciembre de 2024, 14:34

Autor Tema:  Duda, Lista Circular  (Leído 2085 veces)

ANDREYU

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Duda, Lista Circular
« en: Domingo 27 de Noviembre de 2011, 18:37 »
0
Hola, como estan todos, soy nuevo en ete foro, estoy llevando un curso de univesidad en el que usamos c++, mi pregunta es:

mi profesor nos puso una tarea de hacer una lista, cola, pila o arbol, circular, parecido a una agenda de telefono, donde se agreguen contactos y se puedan ver uno por uno, y que uno pueda poner siguienente y atras.

ya tengo hecho la estructura y puedo ver cada nodo uno por uno, pero no se como conectar el ultimo nodo al primero y el primero al ultimo.

creo que he podido conectarlos, pero tuve que quitar el while para mostrarlos y solo me muestra el primer nodo y el ultimo ingresado.

les agradesco su ayuda y tiempo, gracias.

este es el codigo que he hecho.

Código: C++
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <stdlib.h>
  6. #include <iostream.h>
  7.  
  8. struct agenda {
  9.         char nombre[40];
  10.         char apellido[40];
  11.         char telefono[40];
  12.  
  13.         struct agenda *siguiente;
  14.         struct agenda *anterior;
  15. };
  16. agenda *actual=NULL;
  17. agenda *ultimo;
  18. agenda *inicio;
  19. agenda *fin;
  20.  
  21. int main()
  22. {
  23. int opcion;
  24.  
  25. do{
  26. clrscr();
  27.  
  28. cout<<"\t AGENDA\n";
  29. cout<<"\n Seleccione Acci¢n\n";
  30. cout<<"\n 1.-Ingresar Contacto\n";
  31. cout<<"\n 2.-Mostrar Agenda\n";
  32. cout<<"\n 3.-Salir\n";
  33. cout<<"\nOpcion: ";
  34. scanf("%d",&opcion);
  35. getchar();
  36.  
  37. if(opcion>=4)
  38. {
  39. clrscr();
  40. printf("Opcion Incorrecta");
  41. getch();
  42. }
  43. else
  44. {
  45. switch (opcion) {
  46.  
  47. case 1 :
  48. clrscr();
  49.  
  50. char tempnombre[40],tempapellido[40],temptelefono[40];
  51.  
  52. printf("\tINGRESAR\n");
  53. cout<<"\nDigite Nombre: ";
  54. scanf("%s",tempnombre);
  55. cout<<"\nDigite Apellido: ";
  56. scanf("%s",tempapellido);
  57. cout<<"\nDigite Telefono: ";
  58. scanf("%s",temptelefono);
  59.  
  60. clrscr();
  61. if(actual==NULL)
  62. {
  63.         actual=new agenda;
  64.         actual->siguiente=actual->anterior=NULL;
  65.         strcpy(actual->nombre,tempnombre);
  66.         strcpy(actual->apellido,tempapellido);
  67.         strcpy(actual->telefono,temptelefono);
  68. }
  69. else
  70.  {
  71.         agenda *ultimo=actual;
  72.  
  73.         while((ultimo->siguiente!=NULL)&&(strcmp(ultimo->nombre,tempnombre)!=0))
  74.         {
  75.                 ultimo=ultimo->siguiente;
  76.         }
  77.         if(strcmp(ultimo->nombre,tempnombre)==0)
  78.         {
  79.                 strcpy(ultimo->nombre,tempnombre);
  80.         }
  81.         else
  82.         {
  83.                 ultimo->siguiente=new agenda;
  84.                 ultimo->siguiente->siguiente=NULL;
  85.                 ultimo->siguiente->anterior=ultimo;
  86.                 ultimo=ultimo->siguiente;
  87.                 strcpy(ultimo->nombre,tempnombre);
  88.                 strcpy(ultimo->apellido,tempapellido);
  89.                 strcpy(ultimo->telefono,temptelefono);
  90.         }
  91.                 cout<<"\n\n";
  92.  }//finaliza else
  93. break;
  94.  
  95. case 2 :
  96. int opcion1;
  97.  
  98. clrscr();
  99. printf("\tContactos\n\n");
  100.  
  101. if(actual==NULL)
  102. {
  103. cout<<"La Lista esta Vacia";
  104. }
  105. else
  106. {
  107.         agenda *actuall=actual;
  108.  
  109.                 cout<<"Nombre: "<<actuall->nombre<<"  "<<actuall->apellido<<"\n";
  110.                 cout<<"Telefono: "<<actuall->telefono<<"\n";
  111.                 printf("\n");
  112. do
  113. {
  114.  
  115. cout<<"\n 1.-Atras    ";cout<<"2.-Siguiente    ";cout<<"3.-Salir   ";
  116. cout<<"      ";
  117. scanf("%d",&opcion1);
  118. cout<<"\n";
  119.  
  120. switch (opcion1)
  121. {
  122. case 1 :
  123. {
  124. actuall=actuall->anterior;
  125. cout<<"Nombre: "<<actuall->nombre<<"  "<<actuall->apellido<<"\n";
  126. cout<<"Telefono: "<<actuall->telefono<<"\n";
  127. printf("\n");
  128. }
  129. break;
  130.  
  131. case 2 :
  132. {
  133. actuall=actuall->siguiente;
  134. cout<<"Nombre: "<<actuall->nombre<<"  "<<actuall->apellido<<"\n";
  135. cout<<"Telefono: "<<actuall->telefono<<"\n";
  136. printf("\n");
  137. }
  138. break;
  139.  
  140. case 3 :
  141. {
  142. printf("Saliendo");
  143. opcion1=3;
  144. }
  145. break;
  146. }//fin del swith
  147. }//fin del do
  148. while(opcion1!=3);
  149. }
  150. clrscr();
  151. break;
  152.  
  153. case 3 :
  154. {
  155. clrscr();
  156. printf("Fin del Programa");
  157. opcion=3;
  158. getch();
  159. }
  160. break;
  161.  
  162. }//fin de switch
  163. }//fin del else
  164. }//fin de do
  165. while(opcion!=3);
  166. return(0);
  167. }//fin del main
  168.  
« última modificación: Domingo 27 de Noviembre de 2011, 18:54 por ANDREYU »

herzdark

  • Miembro activo
  • **
  • Mensajes: 38
  • Nacionalidad: ar
    • Ver Perfil
Re:Duda, Lista Circular
« Respuesta #1 en: Jueves 1 de Diciembre de 2011, 00:02 »
0
vos lo q estas usando es una lista doblememente enlazada circular no?, entonces ya cuando el nodo es NULL yo podría así:

Código: C
  1.   if(actual==NULL)
  2.     {actual=new agenda;
  3.       actual->siguiente=actual->anterior=actual; //ahi estaria logrando q el nodo sig y ant se apunte a si mismo (o mejor dicho
  4.       strcpy(actual->nombre,tempnombre); //lo q llamamos circular)
  5.       strcpy(actual->apellido,tempapellido);
  6.       strcpy(actual->telefono,temptelefono);
  7.     }
  8.  

después con el tema de saber el principio y final no se si tu puntero de inicio de lista esta al primer nodo, al ultimo nodo insertado (creo q con este serie medio complicado saber el inicio y final) y ultimo nodo, si usas p/e el primer nodo vos ya tenes tu inicio y final entonces lo unirias así:

Código: C
  1. fin->siguiente=inicio;
  2. inicio->anterior= fin;
  3.  

espero q esto te sirve igualmente hacete el dibujo así me salio a mi

ANDREYU

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re:Duda, Lista Circular
« Respuesta #2 en: Martes 20 de Diciembre de 2011, 20:37 »
0
Gracias por la Respuesta, lo siento por responder tarde, pero he tenido muchos trabajos, dejo el codigo de la lista doblemente enlazada circular como quedo si a alguien le sirve despues.

Código: C++
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <stdlib.h>
  6. #include <iostream.h>
  7.  
  8. struct agenda {
  9.         char nombre[40];
  10.         char apellido[40];
  11.         char telefono[40];
  12.  
  13.         struct agenda *siguiente;
  14.         struct agenda *anterior;
  15. };
  16. agenda *actual=NULL;
  17. agenda *ultimo;
  18. agenda *inicio;
  19. agenda *fin;
  20.  
  21. int main()
  22. {
  23.  
  24. int opcion;
  25.  
  26. do{
  27. clrscr();
  28.  
  29. cout<<"\t AGENDA\n";
  30. cout<<"\n Seleccione Acci¢n\n";
  31. cout<<"\n 1.-Ingresar Contacto\n";
  32. cout<<"\n 2.-Mostrar Agenda\n";
  33. cout<<"\n 3.-Salir\n";
  34. cout<<"\nOpcion: ";
  35. scanf("%d",&opcion);
  36. getchar();
  37.  
  38. if(opcion>=4)
  39. {
  40. clrscr();
  41. printf("Opcion Incorrecta");
  42. getch();
  43. }
  44. else
  45. {
  46. switch (opcion) {
  47.  
  48. case 1 :
  49. clrscr();
  50.  
  51. char tempnombre[40],tempapellido[40],temptelefono[40];
  52.  
  53. printf("\tINGRESAR\n");
  54. cout<<"\nDigite Nombre: ";
  55. scanf("%s",tempnombre);
  56. cout<<"\nDigite Apellido: ";
  57. scanf("%s",tempapellido);
  58. cout<<"\nDigite Telefono: ";
  59. scanf("%s",temptelefono);
  60.  
  61. clrscr();
  62. if(actual==NULL)
  63. {
  64.         actual=new agenda;
  65.         inicio=actual;
  66.         actual->siguiente=inicio;
  67.         actual->anterior=inicio;
  68.         strcpy(actual->nombre,tempnombre);
  69.         strcpy(actual->apellido,tempapellido);
  70.         strcpy(actual->telefono,temptelefono);
  71.         fin=actual->siguiente;
  72. }
  73. else
  74.  {
  75.         agenda *ultimo=actual;
  76.  
  77.                 while((ultimo->siguiente!=fin)&&(strcmp(ultimo->nombre,tempnombre)!=0))
  78.         {
  79.                 ultimo=ultimo->siguiente;
  80.         }
  81.         if(strcmp(ultimo->nombre,tempnombre)==0)
  82.         {
  83.                 strcpy(ultimo->nombre,tempnombre);
  84.         }
  85.  
  86.         else
  87.         {
  88.                 ultimo->siguiente=new agenda;
  89.                 ultimo->siguiente->siguiente=inicio;
  90.                 ultimo->siguiente->anterior=ultimo;
  91.                 ultimo=ultimo->siguiente;
  92.                 strcpy(ultimo->nombre,tempnombre);
  93.                 strcpy(ultimo->apellido,tempapellido);
  94.                 strcpy(ultimo->telefono,temptelefono);
  95.                 fin=ultimo->siguiente;
  96.                 actual->anterior=ultimo;
  97.         }
  98.                 cout<<"\n\n";
  99.  }//finaliza else
  100. break;
  101.  
  102. case 2 :
  103. int opcion1;
  104.  
  105. clrscr();
  106. printf("\tContactos\n\n");
  107.  
  108. if(actual==NULL)
  109. {
  110. cout<<"La Lista de Contactos esta Vacia";
  111. getch();
  112. }
  113. else
  114. {
  115.         agenda *actuall=actual;
  116.  
  117.                 cout<<"Nombre: "<<actuall->nombre<<"  "<<actuall->apellido<<"\n";
  118.                 cout<<"Telefono: "<<actuall->telefono<<"\n";
  119.                 printf("\n");
  120.  
  121. do
  122. {
  123.  
  124. cout<<"\n 1.-Atras    ";cout<<"2.-Siguiente    ";cout<<"3.-Salir   ";
  125. cout<<"      ";
  126. scanf("%d",&opcion1);
  127. cout<<"\n";
  128.  
  129. switch (opcion1)
  130. {
  131. case 1 :
  132. {
  133. actuall=actuall->anterior;
  134. cout<<"Nombre: "<<actuall->nombre<<"  "<<actuall->apellido<<"\n";
  135. cout<<"Telefono: "<<actuall->telefono<<"\n";
  136. printf("\n");
  137. }
  138. break;
  139.  
  140. case 2 :
  141. {
  142. actuall=actuall->siguiente;
  143. cout<<"Nombre: "<<actuall->nombre<<"  "<<actuall->apellido<<"\n";
  144. cout<<"Telefono: "<<actuall->telefono<<"\n";
  145. printf("\n");
  146. }
  147. break;
  148.  
  149. }//fin del swith
  150. }//fin del do
  151. while(opcion1!=3);
  152. }
  153. clrscr();
  154. break;
  155.  
  156. case 3 :
  157. {
  158. clrscr();
  159. printf("Fin del Programa");
  160. opcion=3;
  161. getch();
  162. }
  163. break;
  164.  
  165. }//fin de switch
  166. }//fin del else
  167. }//fin de do
  168. while(opcion!=3);
  169. return(0);
  170. }//fin del main