/* Dada una lista que almacena los días de la semana, implemente una operación que reconfigure una Lista Doble (sin usar listas auxiliares) de modo que los nodos se organicen en función de un día especificado por el usuario. Por ejemplo: Original: DOMINGO->LUNES->MARTES->MIERCOLES->JUEVES->VIERNES->SABADO Día de la semana inicial elegida: MIERCOLES Modificada: MIERCOLES->JUEVES->VIERNES->SABADO->DOMINGO->LUNES->MARTES */ #include #include #include using namespace std; typedef char tcad[15]; typedef struct tnodo *pnodo; typedef struct tnodo{ tcad dato; pnodo sig; pnodo ant; }; void iniciar_lista(pnodo &lis); void crear_nodo(pnodo &nuevo); void agregar_final(pnodo &lis, pnodo nuevo); void agregar_orden(pnodo &lis, pnodo nuevo); void mostrar(pnodo lis); void modificar(pnodo &lis, tcad dia); void mostrar_rec(pnodo p, pnodo lis); main() { pnodo lista, nuevo; int cont=7; tcad dia; iniciar_lista(lista); do{ crear_nodo(nuevo); agregar_orden(lista, nuevo); cont--; }while(cont>0); mostrar(lista); cout<<"Ingrese dia inicial: "; gets(dia); modificar(lista, dia); mostrar(lista); cout<<"\nrecursivo"<dato<sig, lista); } void iniciar_lista(pnodo &lis) { lis=NULL; } void crear_nodo(pnodo &nuevo) { nuevo=new tnodo; if(nuevo!=NULL) { cout<<"Ingrese dia de semana: "; gets(nuevo->dato); //strcpy(nuevo->dato,dia) nuevo->ant=NULL; nuevo->sig=NULL; } } void agregar_final(pnodo &lis, pnodo nuevo) { if(lis==NULL) { lis=nuevo; nuevo->sig=lis; //lis->sig=lis el ultimo al primero nuevo->ant=lis;//lis->ant=lis el primero al ultimo } else { nuevo->ant=lis->ant; (nuevo->ant)->sig=nuevo; nuevo->sig=lis; //une el ultimo con el primero lis->ant=nuevo; //une el primero con el ultimo } } void mostrar(pnodo lis) { pnodo i; cout<dato<sig; i!=lis; i=i->sig) cout<dato<dato,dia)!=0) { i=i->sig; } lis=i; } void mostrar_rec(pnodo p, pnodo lis) { if(p!=lis) { cout<dato<sig,lis); } } void agregar_orden(pnodo &lis, pnodo nuevo) { pnodo i; if(lis==NULL) { lis=nuevo; nuevo->sig=lis; lis->ant=nuevo; } else { if(strcmp(nuevo->dato,lis->dato)<0) { nuevo->sig=lis; nuevo->ant=lis->ant;//une el primero con el ultimo lis->ant=nuevo; lis=nuevo; nuevo->ant->sig=lis;//une el ultimo con el primero } else { for(i=lis->sig; i!=lis && strcmp(nuevo->dato,i->dato)>0;i=i->sig); nuevo->sig=i; nuevo->ant=i->ant; i->ant->sig=nuevo; i->ant=nuevo; } } }