Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: d91 en 9 Junio 2014, 13:08 pm



Título: borrar elemento de la lista enlazada simple
Publicado por: d91 en 9 Junio 2014, 13:08 pm
hola a todos, tengo un problema con el codigo de un metodo de una clase porque si encuentra el elemento buscado pero no lo borra estoy usando clases a lo cual mando a enlistar una determinada estructura tal vez me podrían ayuda porque despues de llamar al metodo borrar no borra el elemento que coincide con la busqueda....!
Código
  1. //la estructura es
  2.  
  3. struct protesis{
  4.   char codigo_prot[15];//guarda codigo de protesis
  5.   int tipo_protesis; //guarda el tipo de protesis
  6.   char fecha_ingreso[12];  //guarda fecha de ingreso
  7.   int edad_disenho;   //edad para la que fue disenhada
  8. };
  9.  
  10. //npnodo es un puntero de la clase nodo que estoy utilizando
  11. //de la lista tengo punteros primero5 y actual5;
  12.  
  13.  
  14. //el metodo borrar es
  15. void lista::Borrar(int edad, int tipo) {
  16.   npnodo anterior, nodo;
  17.  
  18.   nodo = primero5;
  19.   anterior = NULL;
  20.  if(primero5!=NULL){
  21.     while(nodo!=NULL){
  22.           if(nodo->valor.edad_disenho==edad && nodo->valor.tipo_protesis==tipo){
  23.           if(nodo==primero5){
  24.               primero5=primero5->siguiente;
  25.               }//del tercer if
  26.               else{
  27.               anterior->siguiente=nodo->siguiente;
  28.               }//del else
  29.               delete(nodo);
  30.           }//del segundo if
  31.           anterior=nodo;
  32.        nodo=nodo->siguiente;
  33.      }//del while
  34.  }//del primer if
  35.  else{
  36.   cout<<"\n\tLista vacia"; getch();
  37.  }


Título: Re: borrar elemento de la lista enlazada simple
Publicado por: eferion en 9 Junio 2014, 13:17 pm
Código
  1. if(primero5!=NULL)
  2. {
  3.  while(nodo!=NULL)
  4.  {
  5.    if(nodo->valor.edad_disenho==edad && nodo->valor.tipo_protesis==tipo)
  6.    {
  7.      if(nodo==primero5)
  8.        primero5=primero5->siguiente;
  9.      else
  10.        anterior->siguiente=nodo->siguiente;
  11.      delete(nodo);
  12.    }
  13.  
  14.    anterior=nodo;
  15.    nodo=nodo->siguiente;
  16.  }
  17. }

Después de "delete(nodo)" el código continúa su ejecución y se encuentra con:

* "anterior=nodo" ya vamos mal asignando direcciones que están borradas
* "nodo=nodo->siguiente" Esto es aún peor...

Te falta un break después de "delete nodo" para salir del algoritmo de búsqueda y evitar que el código haga "cosas raras"



Título: Re: borrar elemento de la lista enlazada simple
Publicado por: d91 en 9 Junio 2014, 13:44 pm
se me habia olvida el pedazo de codigo de donde le mando a llamar
Código
  1. void lista::Buscar(pacientes datos){
  2.  
  3.   npnodo aux;
  4.  
  5.   int band=0, salir=0;
  6.   char opcion;  //para capturar la decision del usuario
  7.   aux=primero5;
  8.  
  9.   while(aux!=NULL){
  10.  
  11.      if(aux->valor.edad_disenho==datos.edad && aux->valor.tipo_protesis==datos.tipo_protesis)//al presionar que si
  12. //la quiero reservar me da error en esta linea dice desbordamientod de pila
  13.      {
  14.          cout<<"\n\n\tLa protesis "<<aux->valor.codigo_prot<<" esta disponible";
  15.          //bucle para obtener la decision del usuario
  16.          do{
  17.           gotoxy(10,15);cout<<"Desea utilizarla? (S/N) ";
  18.          do{
  19.            opcion=toupper(getch());
  20.          }while(!isalpha(opcion));
  21.          cout<<opcion;
  22.           if(opcion=='N'||opcion=='S')salir=1;
  23.            else salir=0;
  24.          }while(salir!=1);
  25.          if(opcion=='S'){dat_reservados.encolar(aux->valor,datos);
  26.  
  27.          cout<<"edad"<<aux->valor.edad_disenho<<endl;
  28.          cout<<"tipo"<<aux->valor.tipo_protesis<<endl;
  29.          getch();
  30.           Borrar(aux->valor.edad_disenho,datos.tipo_protesis); //aqui no se si llama asi o con el nombre del tipo de lista,
  31. // pero al ejecutar me da desboramiento de la pila en la linea
  32. //donde esta el if que busca la coincidencia de los datos
  33.  
  34.          }
  35.  
  36.  
  37.  
  38.          band=1;
  39.          getch();
  40.      }//del if
  41.      aux=aux->siguiente;
  42.   }//del while
  43.   if(band==0){
  44.     cout<<"\n\n\tNo hay protesis disponible";
  45.         getch();
  46.   }
  47. }
  48.  
  49.