Está en la página 1de 3

//practica: Lista doblemente enlazada con menu #include<iostream> #include<string.h> #include<stdlib.

h> using namespace std; #define ASCENDENTE 1 #define DESCENDENTE 0 class Nodo{ int valor; char nombre[20]; Nodo *siguiente, *anterior; public: Nodo(int v=0,char nom[20]=NULL,Nodo *sig=NULL,Nodo *ant=NULL): valor(v),siguiente(sig),anterior(ant) {int i=0;while(nom[i]!='\n'){nombre[i]=nom[i];i++;} } friend class lista; }; typedef Nodo *pnodo; class lista{ pnodo plista; public: lista():plista(NULL){} ~lista(); void insertar(int v, char nom[20]); void borrar(int v); bool Listavacia(){return plista==NULL; } void mostrar(int); void Siguiente(); void anterior(); void primero(); void ultimo(); bool actual(){return plista!=NULL; } int valoractual(){return plista->valor; } }; void lista::insertar(int v,char nom[20]){ pnodo nuevo; primero(); if(Listavacia()||plista->valor>v){ nuevo=new Nodo(v,nom[20],plista); if(!plista)plista=nuevo; else plista->anterior=nuevo; } else{ while(plista->siguiente&&plista->siguiente->valor<=v) Siguiente(); nuevo=new Nodo(v,nom[20],plista->siguiente,plista); plista->siguiente=nuevo; if(nuevo->siguiente) nuevo->siguiente->anterior=nuevo; } } void lista::primero(){

while(plista&&plista->anterior) plista=plista->anterior; } void lista::Siguiente(){ if(plista)plista=plista->siguiente; } void lista::mostrar(int orden){ pnodo aux; if(orden==ASCENDENTE){ primero(); aux=plista; while(aux){ cout<<aux->valor <<", "<<aux->nombre<<"->"; aux=aux->siguiente;} } else{ ultimo(); aux=plista; while(aux){ cout<<aux->valor<<", "<<aux->nombre<<"->"; aux=aux->anterior; }} cout<<endl; } void lista::ultimo(){ while(plista&&plista->siguiente) plista=plista->siguiente; } void lista::borrar(int v) { pnodo nodo; nodo = plista; while(nodo && nodo->valor < v) nodo = nodo->siguiente; while(nodo && nodo->valor > v) nodo = nodo->anterior; if(!nodo || nodo->valor != v) return; if(nodo->anterior) nodo->anterior->siguiente = nodo->siguiente; if(nodo->siguiente) nodo->siguiente->anterior = nodo->anterior; delete nodo; } lista::~lista() { pnodo aux; primero(); while(plista) { aux = plista; plista = plista->siguiente; delete aux; } } int main(){ lista milista; int op=0,n,ch, i=1; char M[20]; while(i){

system("clear"); cout<<" elija una opcion: "<<endl<<endl <<"1 insertar nodo"<<endl <<"2 mostrar lista descendente"<<endl <<"3 mostrar lista ascendente"<<endl <<"4 borrar nodo"<<endl <<"5 salir"<<endl <<"6 ver primero"<<endl<<"7 ver ultimo"<<endl<<endl <<"seleccion? "; cin>>op; switch(op){ case 1: cout<<"insertar valor: ";cin>>n; cout<<endl<<"insertar nombre: ";cin.ignore(); cin.getline(M,20,'\n'); milista.insertar(n,M[20]); break; case 2: milista.mostrar(ASCENDENTE);cin.ignore();cin.get(); break; case 3: milista.mostrar(DESCENDENTE);cin.ignore();cin.get(); break; case 4: cout<<"dato a borrar: "; cin>>n; milista.borrar(n); break; case 5: i=0; break; case 6: milista.primero(); cout<<endl<<"valor actual"<<milista.valoractual(); cin.ignore();cin.get(); break; case 7: milista.ultimo(); cout<<milista.valoractual(); cin.ignore(); cin.get(); break; default:cout<<"seleccion invalida!";break; } } return 0;}

También podría gustarte