Modificacion del orden de una lista simplemente enlazada

Iniciado por Beginner Web, 2 Septiembre 2018, 16:57 PM

0 Miembros y 1 Visitante están viendo este tema.

Beginner Web

Hola, queria saber como puedo alterar el orden de una lista enlazada simple me piden lo siguiente, sin utilizar listas auxiliares, hacer una operacion donde los nodos se modifiquen segun espefica el usuario

LISTA ORIGINAL: LUNES->MARTES->MIERCOLES->JUEVES->VIERNES->SABADO->DOMINGO
Dia especificado por el usuario: JUEVES
LISTA MODIFICADA: JUEVES->VIERNES->SABADO->DOMINGO->LUNES->MARTES->MIERCOLES

He intentado ir agregando al final de la lista original los datos que son diferentes al dato especificado por el usuario y borrando el elemento inicial de la lista pero no tuve exito aca dejo el programa solo fijense en el modulo que se llama void modificar_lista(pnodo &lista)

Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
#include <string.h>

using namespace std;

typedef char tcad[16];
typedef struct tnodo *pnodo;
typedef struct tnodo{
tcad dato;
pnodo sig;
};

void inicia(pnodo &lista);
void crear(pnodo &nuevo);
void agregar_final(pnodo &lista, pnodo nuevo);
pnodo quitar_inicio(pnodo &lista);
void modificar_lista(pnodo &lista);
void mostrar(pnodo lista);

int main()
{
pnodo milista, nodo;
int opcion;
inicia(milista);
do{
system("cls");
cout << "1. Iniciar lista" << endl;
cout << "2. Agregar elementos a la lista" << endl;
cout << "3. Modificar lista" << endl;
cout << "4. Mostrar lista" << endl;
cout << "5. Salir" << endl;
cin >> opcion;
switch(opcion){
case 1: inicia(milista); break;
case 2: crear(nodo); if(nodo!=NULL){agregar_final(milista,nodo);}; break;
case 3: modificar_lista(milista); break;
case 4: cout << "***LISTA***" << endl; mostrar(milista); break;
case 5: cout << "FIN DEL  PROGRAMA" << endl; break;
default: cout << "Opcion incorrecta" << endl;
}
system("pause");
}while(opcion!=5);
}

void inicia(pnodo &lista)
{
lista=NULL;
}

void crear(pnodo &nuevo)
{
nuevo=new tnodo;
if(nuevo!=NULL){
cout << "Ingrese dato: "; cin >> nuevo->dato;
nuevo->sig=NULL;
}
else{
cout << "MEMORIA INSUFICIENTE" << endl;
}
}

void agregar_final(pnodo &lista, pnodo nuevo)
{
pnodo i;
if(lista==NULL){
lista=nuevo;
}
else{
for(i=lista;i->sig!=NULL;i=i->sig);
i->sig=nuevo;
}
}

pnodo quitar_inicio(pnodo &lista)
{
pnodo borrado;
if(lista==NULL){
borrado=NULL;
}
else{
borrado=lista;
lista=lista->sig;
borrado->sig=NULL;
}
return borrado;
}

void modificar_lista(pnodo &lista)
{
pnodo i;
tcad buscado;
cout << "Ingrese dia de la semana: "; cin >> buscado;
for(i=lista;i!=NULL;i=i->sig){
if(strcmp(i->dato,buscado)!=0){
agregar_final(lista,i);
delete(quitar_inicio(lista));
}
else{
break;
}
}
}

void mostrar(pnodo lista)
{
pnodo i;
if(lista!=NULL){
for(i=lista;i!=NULL;i=i->sig){
cout << "Nodo: " << i->dato << endl;
}
cout << endl;
}
else{
cout << "LISTA VACIA" << endl;
}
}
7w7

CalgaryCorpus

Que tal si haces una pasada para encontrar el elemento, el previo a este y el final de la lista?

Con eso tendrias:
- el primero
- uno antes del que buscas: prev
- el que buscas
- el ultimo

Luego haces que el previo apunte a null, que el ultimo apunte al inicio actual y que el inicio de la lista sea el que buscas


Aqui mi perfil en LinkedIn, invitame un cafe aqui

Beginner Web

No, tiene que ser lista enlazada simple sin apuntadores y sin usar listas auxiliares, igual gracias
7w7

MAFUS

Pues buscas el nodo que el siguiente sea el dato buscado.
Haces que el inició de la lista apunte al siguiente dato.
Haces que el el final de la lista apunte a lo que era originalmente el inicio de la lista.
Haces que el nodo en el que estás apunte su siguiente a NULL.
Necesitarás alguna variable pnodo auxiliar.

Beginner Web

Use un bubble_sort sobre la lista fue mas facil

Código (cpp) [Seleccionar]
void modificar_lista(pnodo &lista)
{
pnodo i, j;
tcad buscado, aux;
bool ordenado=true;
cout << "Ingrese dia de la semana: "; cin >> buscado;
while(ordenado){
if(strcmp(lista->dato,buscado)==0){
ordenado=false;
}
else{
for(i=lista;i->sig!=NULL;i=i->sig){
j=i->sig;
strcpy(aux,i->dato);
strcpy(i->dato,j->dato);
strcpy(j->dato,aux);
}
}
}
}
7w7