asignatura: estructuras y bases de datos practica: listas circulares doblemente ligadas #include #include #include #include class nodo { public: int dato; nodo *ant, *sig; }; typedef nodo *pnodo; class lista_cdl:public nodo { public: pnodo inicial, actual, temp, temp1, temp2, aux, pivote; lista_cdl(void); int agregar(int); int buscar (int); int actualizar (int, int); int listar(void); int mostrar (void); int borrar (int); int insertar (int, int); int comprobarlista(void); }; lista_cdl::lista_cdl(void) { inicial=NULL; actual=NULL; temp=NULL; temp1=NULL; temp2=NULL; aux=NULL; pivote=NULL; } int lista_cdl::comprobarlista(void) { if (actual==NULL) return 1; else { return 0; } } int lista_cdl::agregar(int v) { if (inicial==NULL) { inicial=new (nodo); inicial->dato=v; inicial->sig=inicial; inicial->ant=inicial; //pivote=inicial; actual=inicial; return 1; } else { if (actual->sig==actual && actual->ant==actual) { temp=new (nodo); temp->dato=v; temp->sig=actual; temp->ant=actual; actual->sig=temp; actual->ant=temp; actual=temp; } else { temp=new (nodo); temp->dato=v; temp1=actual->sig; temp->sig=temp1; temp->ant=actual; actual->sig=temp; temp1->ant=temp; actual=temp; } } return 0; } int lista_cdl::listar(void) { aux=actual; pivote=aux; aux=aux->sig; /*while (aux!=pivote) aux=aux->ant;*/ cout<<"\n"; while (aux!=pivote) { cout<<"\nDato: "<dato; aux=aux->sig; } cout<<"\nDato: "<dato; return 1; } int lista_cdl::mostrar(void) { if (actual!=NULL) { cout<<"\nEl elemento actual es "<dato; return 1; } else { return 0; } } int lista_cdl::buscar(int v) { pivote=actual; actual=actual->sig; while (actual!=pivote && actual->dato!=v) actual=actual->sig; if (actual->dato==v) { return 1; } else { return 0; } } int lista_cdl::actualizar (int buscado, int nuevo) { if (buscar(buscado)) { actual->dato=nuevo; return 1; } else { return 0; } } int lista_cdl::borrar(int buscado) { if (buscar(buscado)) { if (actual==actual->ant && actual==actual->sig) { delete (actual); actual=NULL; inicial=NULL; } else { if (actual->ant==actual->sig) { temp=actual->sig; temp->sig=temp; temp->ant=temp; delete (actual); actual=temp; } else { temp1=actual->ant; temp2=actual->sig; temp1->sig=actual->sig; temp2->ant=actual->ant; delete (actual); actual=temp2; } } return 1; } else { return 0; } } int lista_cdl::insertar(int buscado, int nuevo) { if (buscar(buscado)) { temp=new (nodo); temp->dato=nuevo; aux=actual->sig; actual->sig=temp; temp->ant=actual; temp->sig=aux; aux->ant=temp; actual=temp; return 1; } else { return 0; } } void main (void) { lista_cdl a; int v, b, opc; do { clrscr(); cout<<"\nPROGRAMA DE LISTAS CIRCULARES DOBLEMENTE LIGADAS"; cout<<"\n\n1.- Agregar un elemento \n"; cout<<"\n2.- Listar todos los elementos \n"; cout<<"\n3.- Actualizar un elemento de la lista \n"; cout<<"\n4.- Buscar un elemento \n"; cout<<"\n5.- Mostrar el elemento actual \n"; cout<<"\n6.- Borrar un elemeto \n"; cout<<"\n7.- Insertar un nodo despues de uno elegido por el usuario \n"; cout<<"\n8.- Salir"; cout<<"\n\n\nIntroduce una opci˘n: "; cin>>opc; switch(opc) { case 1: cout<<"\nDame el valor a insertar\n"; cin>>v; a.agregar(v); break; case 2: if (a.comprobarlista()) { cout<<"\n\nLista vacia"; } else { a.listar(); } getch(); break; case 3: if (a.comprobarlista()) { cout<<"\n\nLista vacia"; } else { cout<<"\n\nDame el valor que deseas actualizar\n"; cin>>b; if (a.buscar(b)) { cout<<"\nElemento encontrado"; cout<<"\n\nDame el nuevo valor\n"; cin>>v; a.actualizar(b,v); } else { cout<<"\n\nElemento no encontrado"; } } getch(); break; case 4: if (a.comprobarlista()) { cout<<"\n\nLista vacia"; } else { cout<<"\n\nDame el dato a buscar \n"; cin>>b; if (a.buscar(b)) { cout<<"\n\nElemento encontrado"; } else { cout<<"\n\nElemento no encontrado"; } } getch(); break; case 5: if (a.comprobarlista()) { cout<<"\n\nLista vacia"; } else { a.mostrar(); } getch(); break; case 6: if (a.comprobarlista()) { cout<<"\n\nLista vacia"; } else { cout<<"\n\nDame el dato que deseas borrar \n"; cin>>b; if (a.buscar(b)) { cout<<"\n\nElemento encontrado"; a.borrar(b); } else { cout<<"\n\nElemento no encontrado"; } } getch(); break; case 7: if (a.comprobarlista()) { cout<<"\n\nLista vacia"; } else { cout<<"\n\nDame el dato del que a continuacion se insertara un nuevo dato \n"; cin>>b; if (a.buscar(b)) { cout<<"\n\nElemento encontrado"; cout<<"\n\nDame el nuevo dato a insertar \n"; cin>>v; a.insertar(b,v); } else { cout<<"\n\nElemento no encontrado"; } } getch(); break; case 8: cout<<"\n\nAdios!!!"; getch(); break; default: cout<<"\n\nOpcion no valida, vuele a elegir"; getch(); break; } } while (opc!=8); }