Ayuda con listas

Iniciado por Beginner Web, 3 Septiembre 2018, 01:56 AM

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

Beginner Web

Hola nuevamente, tengo 2 fallos en las funciones quitar_final() y quitar_nodo(); No se cual sea el problema algo debo estar haciendo mal o sera el sueño no se  :huh:

Aqui os dejo el codigo completo

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

using namespace std;

typedef struct tnodo *pnodo;
typedef struct tnodo{
int dato;
pnodo sig;
};
typedef struct tlista{
pnodo inicio;
pnodo final;
};

void inicia(tlista &lista);
void crear(pnodo &nuevo);
void agregar_inicio(tlista &lista, pnodo nuevo);
void agregar_final(tlista &lista, pnodo nuevo);
void agregar_orden(tlista &lista, pnodo nuevo);
pnodo quitar_inicio(tlista &lista);
pnodo quitar_final(tlista &lista);
pnodo quitar_nodo(tlista &lista, int valor);
bool buscar_nodo(tlista lista,int valor);
void mostrar(tlista lista);

int main()
{
tlista milista;
pnodo nuevonodo, eliminado;
int opcion, num;
inicia(milista);
do{
system("cls");
cout << "1. Iniciar lista" << endl;
cout << "2. Agregar al inicio" << endl;
cout << "3. Agregar al final" << endl;
cout << "4. Agregar en orden" << endl;
cout << "5. Quitar al inicio" << endl;
cout << "6. Quitar al final" << endl;
cout << "7. Quitar valor" << endl;
cout << "8. Buscar valor" << endl;
cout << "9. Mostrar lista" << endl;
cout << "10. Salir" << endl;
cin >> opcion;
switch(opcion){
case 1: inicia(milista); break;
case 2: crear(nuevonodo); if(nuevonodo!=NULL){agregar_inicio(milista,nuevonodo);}; break;
case 3: crear(nuevonodo); if(nuevonodo!=NULL){agregar_final(milista,nuevonodo);}; break;
case 4: crear(nuevonodo); if(nuevonodo!=NULL){agregar_orden(milista,nuevonodo);}; break;
case 5: eliminado=quitar_inicio(milista);
if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl;delete(eliminado);}
else{cout << "LISTA VACIA O NO EXISTE VALOR" << endl;}; break;
case 6: eliminado=quitar_final(milista);
if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl;delete(eliminado);}
else{cout << "LISTA VACIA O NO EXISTE VALOR" << endl;}; break;
case 7: cout << "Igrese valor a eliminar: "; cin >> num; eliminado=quitar_nodo(milista,num);
if(eliminado!=NULL){cout << "Eliminado: " << eliminado->dato << endl; delete(eliminado);}
else{ cout << "LISTA VACIA O NO EXISTE VALOR" << endl;}; break;
case 8: cout << "Ingrese valor buscado: "; cin >> num;
if(buscar_nodo(milista,num)==true){cout << "VALOR ENCONTRADO" << endl;}
else{ cout << "LISTA VACIA O NO EXISTE VALOR" << endl;}; break;
case 9: cout << "*** LISTA ***" << endl; mostrar(milista); break;
case 10: cout << "FIN DEL  PROGRAMA" << endl; break;
default: cout << "Opcion incorrecta" << endl;
}
system("pause");
}while(opcion!=10);
}

void inicia(tlista &lista)
{
lista.inicio=NULL;
lista.final=NULL;

}

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

void agregar_inicio(tlista &lista, pnodo nuevo)
{
if(lista.inicio==NULL){
lista.inicio=nuevo;
lista.final=nuevo;
}
else{
nuevo->sig=lista.inicio;
lista.inicio=nuevo;
}
}

void agregar_final(tlista &lista, pnodo nuevo)
{
if(lista.inicio==NULL){
lista.inicio=nuevo;
lista.final=nuevo;
}
else{
lista.final->sig=nuevo;
lista.final=nuevo;
}
}

void agregar_orden(tlista &lista, pnodo nuevo)
{
pnodo i;
if(lista.inicio==NULL){
lista.inicio=nuevo;
lista.final=nuevo;
}
else{
if(nuevo->dato<lista.inicio->dato){
nuevo->sig=lista.inicio;
lista.inicio=nuevo;
}
else{
if(nuevo->dato>lista.final->dato){
lista.final->sig=nuevo;
lista.final=nuevo;
}
else{
for(i=lista.inicio;i->sig!=NULL && nuevo->dato>(i->sig)->dato;i=i->sig){
nuevo->sig=i->sig;
i->sig=nuevo;
}
}
}
}
}

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

pnodo quitar_final(tlista &lista) //ERROR
{
pnodo borrado, i;
if(lista.inicio==NULL){
borrado=NULL;
}
else{
if(lista.inicio==lista.final){
borrado=lista.inicio;
lista.inicio=NULL;
lista.final=NULL;
}
else{
for(i=lista.inicio;(i->sig)->sig!=NULL;i=i->sig);
borrado=lista.final;
lista.final->sig=NULL;
}
}
return borrado;
}

pnodo quitar_nodo(tlista &lista, int valor) //ERROR
{
pnodo borrado, i;
if(lista.inicio==NULL){
borrado=NULL;
}
else{
if(lista.inicio->dato==valor){
borrado=lista.inicio;
if(lista.inicio==lista.final){
lista.inicio=NULL;
lista.final=NULL;
}
else{
lista.inicio=NULL;
borrado->sig=NULL;
}
}
else{
for(i=lista.inicio;i->sig!=NULL && valor!=(i->sig)->dato;i=i->sig);
if(i->sig!=NULL){
borrado=NULL;
}
else{
borrado=i->sig;
borrado->sig=NULL;
}
}
}
return borrado;
}

bool buscar_nodo(tlista lista,int valor)
{
pnodo i;
bool encontrado=false;
if(lista.inicio!=NULL){
for(i=lista.inicio;i!=NULL && encontrado==false;i=i->sig){
if(i->dato==valor){
encontrado=true;
}
}
}
return encontrado;
}

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

MAFUS

En quitar_final

for(i=lista.inicio;(i->sig)->sig!=NULL;i=i->sig); // for sin efecto por el ; final
borrado=lista.final; // aun habiendo conseguido el dato en el for anterior aquí directamente apuntas a lista.final
lista.final->sig=NULL;

Beginner Web

Ahhh tenes razon, la solucion seria esta  ;-)

Código (cpp) [Seleccionar]
pnodo quitar_final(tlista &lista) //ERROR
{
pnodo borrado, i;
if(lista.inicio==NULL){
borrado=NULL;
}
else{
if(lista.inicio==lista.final){
borrado=lista.inicio;
lista.inicio=NULL;
lista.final=NULL;
}
else{
for(i=lista.inicio;(i->sig)->sig!=NULL;i=i->sig);
borrado=lista.final;
lista.final=i;
lista.final->sig=NULL;
}
}
return borrado;
}


Me faltaria el quitar nodo segun un valor especifico  :huh:
7w7