Programación General > C/C++
Duda, Lista Circular
(1/1)
ANDREYU:
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++ ---#include <stdio.h>#include <conio.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#include <iostream.h> struct agenda { char nombre[40]; char apellido[40]; char telefono[40]; struct agenda *siguiente; struct agenda *anterior;};agenda *actual=NULL;agenda *ultimo;agenda *inicio;agenda *fin; int main(){int opcion; do{clrscr(); cout<<"\t AGENDA\n";cout<<"\n Seleccione Acci¢n\n";cout<<"\n 1.-Ingresar Contacto\n";cout<<"\n 2.-Mostrar Agenda\n";cout<<"\n 3.-Salir\n";cout<<"\nOpcion: ";scanf("%d",&opcion);getchar(); if(opcion>=4){clrscr();printf("Opcion Incorrecta");getch();}else{switch (opcion) { case 1 :clrscr(); char tempnombre[40],tempapellido[40],temptelefono[40]; printf("\tINGRESAR\n");cout<<"\nDigite Nombre: ";scanf("%s",tempnombre);cout<<"\nDigite Apellido: ";scanf("%s",tempapellido);cout<<"\nDigite Telefono: ";scanf("%s",temptelefono); clrscr();if(actual==NULL){ actual=new agenda; actual->siguiente=actual->anterior=NULL; strcpy(actual->nombre,tempnombre); strcpy(actual->apellido,tempapellido); strcpy(actual->telefono,temptelefono);}else { agenda *ultimo=actual; while((ultimo->siguiente!=NULL)&&(strcmp(ultimo->nombre,tempnombre)!=0)) { ultimo=ultimo->siguiente; } if(strcmp(ultimo->nombre,tempnombre)==0) { strcpy(ultimo->nombre,tempnombre); } else { ultimo->siguiente=new agenda; ultimo->siguiente->siguiente=NULL; ultimo->siguiente->anterior=ultimo; ultimo=ultimo->siguiente; strcpy(ultimo->nombre,tempnombre); strcpy(ultimo->apellido,tempapellido); strcpy(ultimo->telefono,temptelefono); } cout<<"\n\n"; }//finaliza elsebreak; case 2 :int opcion1; clrscr();printf("\tContactos\n\n"); if(actual==NULL){cout<<"La Lista esta Vacia";}else{ agenda *actuall=actual; cout<<"Nombre: "<<actuall->nombre<<" "<<actuall->apellido<<"\n"; cout<<"Telefono: "<<actuall->telefono<<"\n"; printf("\n");do{ cout<<"\n 1.-Atras ";cout<<"2.-Siguiente ";cout<<"3.-Salir ";cout<<" ";scanf("%d",&opcion1);cout<<"\n"; switch (opcion1){case 1 :{actuall=actuall->anterior;cout<<"Nombre: "<<actuall->nombre<<" "<<actuall->apellido<<"\n";cout<<"Telefono: "<<actuall->telefono<<"\n";printf("\n");}break; case 2 :{actuall=actuall->siguiente;cout<<"Nombre: "<<actuall->nombre<<" "<<actuall->apellido<<"\n";cout<<"Telefono: "<<actuall->telefono<<"\n";printf("\n");}break; case 3 :{printf("Saliendo");opcion1=3;}break;}//fin del swith}//fin del dowhile(opcion1!=3);}clrscr();break; case 3 :{clrscr();printf("Fin del Programa");opcion=3;getch();}break; }//fin de switch}//fin del else}//fin de dowhile(opcion!=3);return(0);}//fin del main
herzdark:
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 --- if(actual==NULL) {actual=new agenda; actual->siguiente=actual->anterior=actual; //ahi estaria logrando q el nodo sig y ant se apunte a si mismo (o mejor dicho strcpy(actual->nombre,tempnombre); //lo q llamamos circular) strcpy(actual->apellido,tempapellido); strcpy(actual->telefono,temptelefono); }
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 ---fin->siguiente=inicio;inicio->anterior= fin;
espero q esto te sirve igualmente hacete el dibujo así me salio a mi
ANDREYU:
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++ ---#include <stdio.h>#include <conio.h>#include <string.h>#include <ctype.h>#include <stdlib.h>#include <iostream.h> struct agenda { char nombre[40]; char apellido[40]; char telefono[40]; struct agenda *siguiente; struct agenda *anterior;};agenda *actual=NULL;agenda *ultimo;agenda *inicio;agenda *fin; int main(){ int opcion; do{clrscr(); cout<<"\t AGENDA\n";cout<<"\n Seleccione Acci¢n\n";cout<<"\n 1.-Ingresar Contacto\n";cout<<"\n 2.-Mostrar Agenda\n";cout<<"\n 3.-Salir\n";cout<<"\nOpcion: ";scanf("%d",&opcion);getchar(); if(opcion>=4){clrscr();printf("Opcion Incorrecta");getch();}else{switch (opcion) { case 1 :clrscr(); char tempnombre[40],tempapellido[40],temptelefono[40]; printf("\tINGRESAR\n");cout<<"\nDigite Nombre: ";scanf("%s",tempnombre);cout<<"\nDigite Apellido: ";scanf("%s",tempapellido);cout<<"\nDigite Telefono: ";scanf("%s",temptelefono); clrscr();if(actual==NULL){ actual=new agenda; inicio=actual; actual->siguiente=inicio; actual->anterior=inicio; strcpy(actual->nombre,tempnombre); strcpy(actual->apellido,tempapellido); strcpy(actual->telefono,temptelefono); fin=actual->siguiente;}else { agenda *ultimo=actual; while((ultimo->siguiente!=fin)&&(strcmp(ultimo->nombre,tempnombre)!=0)) { ultimo=ultimo->siguiente; } if(strcmp(ultimo->nombre,tempnombre)==0) { strcpy(ultimo->nombre,tempnombre); } else { ultimo->siguiente=new agenda; ultimo->siguiente->siguiente=inicio; ultimo->siguiente->anterior=ultimo; ultimo=ultimo->siguiente; strcpy(ultimo->nombre,tempnombre); strcpy(ultimo->apellido,tempapellido); strcpy(ultimo->telefono,temptelefono); fin=ultimo->siguiente; actual->anterior=ultimo; } cout<<"\n\n"; }//finaliza elsebreak; case 2 :int opcion1; clrscr();printf("\tContactos\n\n"); if(actual==NULL){cout<<"La Lista de Contactos esta Vacia";getch();}else{ agenda *actuall=actual; cout<<"Nombre: "<<actuall->nombre<<" "<<actuall->apellido<<"\n"; cout<<"Telefono: "<<actuall->telefono<<"\n"; printf("\n"); do{ cout<<"\n 1.-Atras ";cout<<"2.-Siguiente ";cout<<"3.-Salir ";cout<<" ";scanf("%d",&opcion1);cout<<"\n"; switch (opcion1){case 1 :{actuall=actuall->anterior;cout<<"Nombre: "<<actuall->nombre<<" "<<actuall->apellido<<"\n";cout<<"Telefono: "<<actuall->telefono<<"\n";printf("\n");}break; case 2 :{actuall=actuall->siguiente;cout<<"Nombre: "<<actuall->nombre<<" "<<actuall->apellido<<"\n";cout<<"Telefono: "<<actuall->telefono<<"\n";printf("\n");}break; }//fin del swith}//fin del dowhile(opcion1!=3);}clrscr();break; case 3 :{clrscr();printf("Fin del Programa");opcion=3;getch();}break; }//fin de switch}//fin del else}//fin de dowhile(opcion!=3);return(0);}//fin del main
Navegación
Ir a la versión completa