(DUDA) Eliminar elementos de una lista

Iniciado por pitka, 24 Mayo 2012, 09:58 AM

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

pitka

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!

Código (cpp) [Seleccionar]

#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       
}

Ferno

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

pitka

Cita de: Ferno en 24 Mayo 2012, 14:04 PM
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!!

Código (cpp) [Seleccionar]
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       
}

k3r00t

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:

if(p == pIni)

Si no entro al ciclo, tu P no se movio y ese es el dato a eliminar.

pitka

muchísimas gracias a los 2 lo he solucionado..!