Autor
|
Tema: (DUDA) Eliminar elementos de una lista (Leído 14,148 veces)
|
pitka
Desconectado
Mensajes: 25
|
Hola de nuevo por aca molestando con una gran duda (al menos para mi), pues verán con la ayuda del foro y lo que he leído en la red, tengo este código que va llenando una lista de personas a las cuales le pide su nombre, id y edad, consultar por id y eliminar toda la lista eso hasta ahora lo hace bien o eso creo, el problema esta cuando trato de eliminar a una persona de la lista ingresando yo el id a eliminar, si no es el primer elemento ingresado lo elimina perfectamente pero si es el primero no funciona al intentar volver al menú, dejo el código para que vean lo que llevo hecho y también de que todos los errores que tengan me orienten para mejorar, de antemano gracias y saludos! #include <iostream> using namespace std; #define VOLVER_MENU cout<<"\n\nPRESIONE ENTER PARA VOLVER AL MENU"; setbuf(stdin, NULL); cin.get(); struct nodo { string nombre; int id; int edad; nodo *siguiente; }; nodo *pIni = NULL; nodo *pFin; nodo *p; char op = 'n'; int cont = 0; int i = 0; int enc =0; void cargar(); void mostrarlista(); void cargarnodo(nodo *x); void consultar(); void eliminar(); void borrarNodo(); int main() { do{ system("cls"); cout<<"Insertar elemento --- (I) (Personas ingresadas) "<<cont<<endl; cout<<"Mostrar elementos --- (M)\n"; cout<<"Consultar elemento -- (C)\n"; cout<<"Eliminar elementos ---(E)\n"; cout<<"Eliminar por id ------(N)\n"; cout<<"Salir --- (S)\n"; cin.get(op); if(toupper(op) == 'I') { cargar(); } else if(toupper(op) == 'M') mostrarlista(); else if(toupper(op) == 'C') consultar(); else if(toupper(op) == 'E') eliminar(); else if(toupper(op) == 'N') borrarNodo(); }while(toupper(op) != 'S'); p = pIni; if(p != NULL) { nodo *aux; while(p!=NULL) { aux = new nodo; aux = pIni; pIni = pIni->siguiente; free(aux); p = p->siguiente; } } return 0; } void mostrarlista() { system("cls"); if(pIni != NULL) { p = pIni; i = 0; while (p->siguiente != NULL) { i++; cout<<i<<"Direccion : "<<int(p)<<endl; cout<<i<<".1) Nombre: "<<p->nombre<<endl; cout<<i<<".2) Id: "<<p->id<<endl; cout<<i<<".3) Edad: "<<p->edad<<endl<<endl; p = p->siguiente; } }else cout<<"NO HAY ELEMENTOS PARA MOSTAR"; VOLVER_MENU } void cargar() { if(pIni == NULL) { pIni = new nodo; pFin = new nodo; pIni->siguiente = pFin; pFin->siguiente = NULL; cargarnodo(pIni); } else { cargarnodo(pFin); pFin->siguiente = new nodo; pFin = pFin->siguiente; pFin->siguiente = NULL; } cont++; p = pIni; } void cargarnodo(nodo *x) { system("cls"); cout<<"introduzca el nombre: "; cin>>x->nombre; cout<<"introduzca el id: "; cin>>x->id; cout<<"introduzca la edad: "; cin>>x->edad; } void consultar() { system("cls"); p = pIni; if(p != NULL) { nodo *c = NULL; c = new nodo; cout<<"INGRESE ID A CONSULTAR\n"; cin>>c->id; enc = 0; while(p != NULL) { if(c->id == p->id) { enc = 1; cout<<"\n\nNombre: "<<p->nombre<<endl; cout<<"id: "<<p->id<<endl; cout<<"Edad: "<<p->edad<<endl; } p = p->siguiente; } if(enc == 0) { cout<<"\n\nELEMENTO NO ENCONTRADO"; } free(c); }else cout<<"NO HAY ELEMENTOS PARA CONSULTAR"; VOLVER_MENU } void eliminar() { system("cls"); p = pIni; if(p!=NULL) { nodo *aux; aux = new nodo; while(p->siguiente != NULL) { aux = pIni; pIni = pIni->siguiente; free(aux); p = p->siguiente; } cout<<"ELEMENTOS ELIMINADOS"; cont = 0; }else cout<<"NO HAY ELEMENTOS PARA ELIMINAR"; VOLVER_MENU } void borrarNodo() { system("cls"); p = pIni; if(p) { nodo *aux = NULL, *ant = NULL; ant = new nodo; aux = new nodo; cout<<"INTRODUZCA EL ID A ELIMINAR\n"; cin>>aux->id; while(aux->id != p->id) { ant = p; p = p->siguiente; } if(aux->id == p->id) { ant = p; p = p->siguiente; free(ant); free(aux); cout<<"ELEMENTO ELIMINADO"; cont--; } }else cout<<"ELEMENTO NO ENCONTRADO"; VOLVER_MENU }
|
|
|
En línea
|
|
|
|
Ferno
Desconectado
Mensajes: 375
|
Con el primero no funciona ya que, el puntero que debes cambiar es pIni en tu code. Lo que tu haces es cambiar un puntero que apunta a cada nodo de la lista, y en teoría está bien! Pero recordá que hay un puntero especial "pIni" que apunta al primer nodo de tu lista, y esa referencia no la estás cambiando cuando debes eliminar el primer nodo. Supongo que por eso no funciona.
La solución más rápida es agregar un if en la parte de eliminado, que pregunte si el nodo a cambiar es igual a pIni. Si eso es cierto, cambias pIni además de p.
Saludos
|
|
|
En línea
|
|
|
|
pitka
Desconectado
Mensajes: 25
|
Con el primero no funciona ya que, el puntero que debes cambiar es pIni en tu code. Lo que tu haces es cambiar un puntero que apunta a cada nodo de la lista, y en teoría está bien! Pero recordá que hay un puntero especial "pIni" que apunta al primer nodo de tu lista, y esa referencia no la estás cambiando cuando debes eliminar el primer nodo. Supongo que por eso no funciona.
La solución más rápida es agregar un if en la parte de eliminado, que pregunte si el nodo a cambiar es igual a pIni. Si eso es cierto, cambias pIni además de p.
Saludos
Lo hice asi y sigue sin funcionar!! void borrarNodo() { system("cls"); p = pIni; if(p != NULL) { nodo *aux = NULL, *ant = NULL; ant = new nodo; aux = new nodo; cout<<"INTRODUZCA EL ID A ELIMINAR\n"; cin>>aux->id; while(aux->id != p->id) { ant = p; p = p->siguiente; } if(ant == pIni) { pIni = pIni->siguiente; free(ant); free(aux); cout<<"ELEMENTO 1 ELIMINADO"; cont--; }else if(aux->id == p->id) { ant = p; p = p->siguiente; free(ant); free(aux); cout<<"ELEMENTO x ELIMINADO"; cont--; } }else cout<<"ELEMENTO NO ENCONTRADO"; VOLVER_MENU }
|
|
|
En línea
|
|
|
|
k3r00t
Desconectado
Mensajes: 17
|
Ferno esta en lo correcto, pero tu cometiste un ligero error en el segundo código que colocaste: while(aux->id != p->id) { ant = p; p = p->siguiente; } if(ant == pIni) { pIni = pIni->siguiente; free(ant); free(aux); cout<<"ELEMENTO 1 ELIMINADO"; cont--; Fijate que, en el caso de que el dato a eliminar sea el primero, p->id seria igual a aux->id, por lo que nunca entraria a ciclo while donde le asignas valor a ant, y luego comparas esa misma variable que todavia vale NULL por no entrar en ciclo, la comparacion debe quedar asi: Si no entro al ciclo, tu P no se movio y ese es el dato a eliminar.
|
|
|
En línea
|
|
|
|
pitka
Desconectado
Mensajes: 25
|
muchísimas gracias a los 2 lo he solucionado..!
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
¿Como hacer la sumaroria de los elementos de una lista?; Python
« 1 2 »
Scripting
|
XD YO
|
10
|
59,750
|
10 Marzo 2010, 04:41 am
por XD YO
|
|
|
Recorriendo los elementos de una lista en un array con bucle for me da error
Programación C/C++
|
dairus20
|
5
|
4,812
|
5 Marzo 2011, 13:29 pm
por dairus20
|
|
|
Programa se cuelga al leer elementos de una lista guardados en un archivo
Programación C/C++
|
Aikanáro Anário
|
2
|
2,673
|
7 Noviembre 2012, 18:43 pm
por Aikanáro Anário
|
|
|
dar la vuelta elementos de una lista
Programación C/C++
|
indict
|
4
|
2,990
|
11 Julio 2013, 01:53 am
por dato000
|
|
|
Duda sobre eliminar nodos de una lista doble
Programación C/C++
|
Beginner Web
|
4
|
1,955
|
14 Diciembre 2018, 02:18 am
por Beginner Web
|
|