elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  (DUDA) Eliminar elementos de una lista
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: (DUDA) Eliminar elementos de una lista  (Leído 13,833 veces)
pitka

Desconectado Desconectado

Mensajes: 25



Ver Perfil
(DUDA) Eliminar elementos de una lista
« en: 24 Mayo 2012, 09:58 am »

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
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. #define VOLVER_MENU cout<<"\n\nPRESIONE ENTER PARA VOLVER AL MENU"; setbuf(stdin, NULL); cin.get();
  5.  
  6.  
  7. struct nodo
  8. {
  9.        string nombre;
  10.        int id;
  11.        int edad;
  12.        nodo *siguiente;      
  13. };
  14.  
  15. nodo *pIni = NULL;
  16. nodo *pFin;
  17. nodo *p;
  18.  
  19. char op = 'n';
  20. int cont = 0;
  21. int i = 0;
  22. int enc =0;
  23.  
  24.  
  25. void cargar();
  26. void mostrarlista();
  27. void cargarnodo(nodo *x);
  28. void consultar();
  29. void eliminar();
  30. void borrarNodo();
  31.  
  32.  
  33. int main()
  34. {
  35.  
  36.      do{          
  37.         system("cls");      
  38.         cout<<"Insertar elemento --- (I) (Personas ingresadas) "<<cont<<endl;        
  39.         cout<<"Mostrar elementos --- (M)\n";  
  40.         cout<<"Consultar elemento -- (C)\n";
  41.         cout<<"Eliminar elementos ---(E)\n";
  42.         cout<<"Eliminar por id ------(N)\n";
  43.         cout<<"Salir --- (S)\n";
  44.         cin.get(op);
  45.         if(toupper(op) == 'I')
  46.             {
  47.              cargar();
  48.             }    
  49.         else if(toupper(op) == 'M')
  50.              mostrarlista();
  51.         else if(toupper(op) == 'C')
  52.              consultar();
  53.         else if(toupper(op) == 'E')
  54.              eliminar();
  55.         else if(toupper(op) == 'N')
  56.              borrarNodo();              
  57.       }while(toupper(op) != 'S');
  58. p = pIni;
  59. if(p != NULL)
  60. {
  61.         nodo *aux;
  62.         while(p!=NULL)
  63.             {  
  64.                 aux = new nodo;
  65.                 aux = pIni;
  66.                 pIni = pIni->siguiente;
  67.                 free(aux);
  68.                 p = p->siguiente;                        
  69.             }
  70. }
  71. return 0;
  72.  
  73. }
  74.  
  75.  
  76. void mostrarlista()
  77. {
  78.  
  79.     system("cls");
  80.      if(pIni != NULL)
  81.         {
  82.           p = pIni;
  83.           i = 0;
  84.         while (p->siguiente != NULL)
  85.            {
  86.                  i++;
  87.                  cout<<i<<"Direccion : "<<int(p)<<endl;
  88.                  cout<<i<<".1) Nombre: "<<p->nombre<<endl;
  89.                  cout<<i<<".2) Id: "<<p->id<<endl;
  90.                  cout<<i<<".3) Edad: "<<p->edad<<endl<<endl;
  91.                  p = p->siguiente;
  92.            }    
  93.        }else
  94.         cout<<"NO HAY ELEMENTOS PARA MOSTAR";
  95.         VOLVER_MENU
  96. }
  97.  
  98.  
  99. void cargar()
  100. {
  101.     if(pIni == NULL)  
  102.       {      
  103.             pIni = new nodo;
  104.             pFin = new nodo;
  105.             pIni->siguiente = pFin;          
  106.             pFin->siguiente = NULL;          
  107.             cargarnodo(pIni);                
  108.       }
  109.       else                                
  110.         {
  111.             cargarnodo(pFin);                      
  112.             pFin->siguiente = new nodo;        
  113.             pFin = pFin->siguiente;          
  114.             pFin->siguiente = NULL;              
  115.         }
  116.       cont++;
  117.       p = pIni;
  118. }
  119.  
  120. void cargarnodo(nodo *x)
  121. {
  122.      system("cls");
  123.      cout<<"introduzca el nombre: ";
  124.      cin>>x->nombre;
  125.      cout<<"introduzca el id: ";
  126.      cin>>x->id;
  127.      cout<<"introduzca la edad: ";
  128.      cin>>x->edad;  
  129. }
  130.  
  131. void consultar()
  132. {
  133.                   system("cls");
  134.                   p = pIni;          
  135.                   if(p != NULL)
  136.                   {
  137.                   nodo *c = NULL;
  138.                   c = new nodo;              
  139.                   cout<<"INGRESE ID A CONSULTAR\n";
  140.                   cin>>c->id;
  141.                   enc = 0;
  142.                   while(p != NULL)
  143.                     {    
  144.                          if(c->id == p->id)
  145.                          {  
  146.                              enc = 1;        
  147.                              cout<<"\n\nNombre: "<<p->nombre<<endl;
  148.                              cout<<"id: "<<p->id<<endl;
  149.                              cout<<"Edad: "<<p->edad<<endl;
  150.  
  151.                          }
  152.                          p = p->siguiente;
  153.                     }    
  154.                     if(enc == 0)
  155.                        {
  156.                            cout<<"\n\nELEMENTO NO ENCONTRADO";
  157.                        }  
  158.                        free(c);
  159.                    }else
  160.                        cout<<"NO HAY ELEMENTOS PARA CONSULTAR";
  161.                        VOLVER_MENU  
  162. }  
  163.  
  164.  
  165. void eliminar()
  166. {
  167.     system("cls");
  168.     p = pIni;
  169.     if(p!=NULL)
  170.     {
  171.         nodo *aux;
  172.         aux = new nodo;
  173.         while(p->siguiente != NULL)
  174.                         {      
  175.                             aux = pIni;
  176.                             pIni = pIni->siguiente;
  177.                             free(aux);
  178.                             p = p->siguiente;                        
  179.                         }
  180.         cout<<"ELEMENTOS ELIMINADOS";                
  181.         cont = 0;    
  182.  
  183.    }else  
  184.       cout<<"NO HAY ELEMENTOS PARA ELIMINAR";
  185.    VOLVER_MENU      
  186. }
  187.  
  188.  
  189. void borrarNodo()
  190. {
  191.     system("cls");
  192.     p = pIni;
  193.     if(p)
  194.     {
  195.  
  196.         nodo *aux = NULL, *ant = NULL;
  197.         ant = new nodo;  
  198.         aux = new nodo;
  199.         cout<<"INTRODUZCA EL ID A ELIMINAR\n";
  200.         cin>>aux->id;
  201.         while(aux->id != p->id)
  202.           {
  203.              ant = p;
  204.              p = p->siguiente;
  205.           }            
  206.             if(aux->id == p->id)
  207.                {                  
  208.                   ant = p;
  209.                   p = p->siguiente;                
  210.                   free(ant);
  211.                   free(aux);
  212.                   cout<<"ELEMENTO ELIMINADO";
  213.                   cont--;
  214.                }                                
  215.    }else  
  216.       cout<<"ELEMENTO NO ENCONTRADO";
  217.    VOLVER_MENU      
  218. }
  219.  


En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: (DUDA) Eliminar elementos de una lista
« Respuesta #1 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


En línea

pitka

Desconectado Desconectado

Mensajes: 25



Ver Perfil
Re: (DUDA) Eliminar elementos de una lista
« Respuesta #2 en: 24 Mayo 2012, 17:52 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
  1. void borrarNodo()
  2. {
  3.     system("cls");
  4.     p = pIni;
  5.     if(p != NULL)
  6.     {
  7.  
  8.         nodo *aux = NULL, *ant = NULL;
  9.         ant = new nodo;  
  10.         aux = new nodo;
  11.         cout<<"INTRODUZCA EL ID A ELIMINAR\n";
  12.         cin>>aux->id;
  13.         while(aux->id != p->id)
  14.           {
  15.              ant = p;
  16.              p = p->siguiente;
  17.           }
  18.           if(ant == pIni)
  19.           {          
  20.              pIni = pIni->siguiente;
  21.              free(ant);
  22.              free(aux);
  23.              cout<<"ELEMENTO 1 ELIMINADO";
  24.              cont--;
  25.           }else if(aux->id == p->id)
  26.                {                  
  27.                   ant = p;
  28.                   p = p->siguiente;                
  29.                   free(ant);
  30.                   free(aux);
  31.                   cout<<"ELEMENTO x ELIMINADO";
  32.                   cont--;
  33.                }                              
  34.    }else  
  35.       cout<<"ELEMENTO NO ENCONTRADO";
  36.    VOLVER_MENU      
  37. }
  38.  
En línea

k3r00t

Desconectado Desconectado

Mensajes: 17



Ver Perfil
Re: (DUDA) Eliminar elementos de una lista
« Respuesta #3 en: 25 Mayo 2012, 15:02 pm »

Ferno esta en lo correcto, pero tu cometiste un ligero error en el segundo código que colocaste:

Código:
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:

Código:
 if(p == pIni)

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

pitka

Desconectado Desconectado

Mensajes: 25



Ver Perfil
Re: (DUDA) Eliminar elementos de una lista
« Respuesta #4 en: 25 Mayo 2012, 23:15 pm »

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

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines