borrar elemento de la lista enlazada simple

Iniciado por d91, 9 Junio 2014, 13:08 PM

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

d91

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 (cpp) [Seleccionar]

//la estructura es

struct protesis{
   char codigo_prot[15];//guarda codigo de protesis
   int tipo_protesis; //guarda el tipo de protesis
   char fecha_ingreso[12];  //guarda fecha de ingreso
   int edad_disenho;   //edad para la que fue disenhada
};

//npnodo es un puntero de la clase nodo que estoy utilizando
//de la lista tengo punteros primero5 y actual5;


//el metodo borrar es
void lista::Borrar(int edad, int tipo) {
   npnodo anterior, nodo;

   nodo = primero5;
   anterior = NULL;
  if(primero5!=NULL){
    while(nodo!=NULL){
           if(nodo->valor.edad_disenho==edad && nodo->valor.tipo_protesis==tipo){
            if(nodo==primero5){
                primero5=primero5->siguiente;
               }//del tercer if
               else{
                anterior->siguiente=nodo->siguiente;
               }//del else
               delete(nodo);
           }//del segundo if
           anterior=nodo;
        nodo=nodo->siguiente;
      }//del while
  }//del primer if
  else{
  cout<<"\n\tLista vacia"; getch();
  }

eferion

Código (cpp) [Seleccionar]

if(primero5!=NULL)
{
  while(nodo!=NULL)
  {
    if(nodo->valor.edad_disenho==edad && nodo->valor.tipo_protesis==tipo)
    {
      if(nodo==primero5)
        primero5=primero5->siguiente;
      else
        anterior->siguiente=nodo->siguiente;
      delete(nodo);
    }
   
    anterior=nodo;
    nodo=nodo->siguiente;
  }
}


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"


d91

se me habia olvida el pedazo de codigo de donde le mando a llamar
Código (cpp) [Seleccionar]

void lista::Buscar(pacientes datos){

   npnodo aux;
 
   int band=0, salir=0;
   char opcion;  //para capturar la decision del usuario
   aux=primero5;

   while(aux!=NULL){

      if(aux->valor.edad_disenho==datos.edad && aux->valor.tipo_protesis==datos.tipo_protesis)//al presionar que si
//la quiero reservar me da error en esta linea dice desbordamientod de pila
      {
          cout<<"\n\n\tLa protesis "<<aux->valor.codigo_prot<<" esta disponible";
          //bucle para obtener la decision del usuario
          do{
          gotoxy(10,15);cout<<"Desea utilizarla? (S/N) ";
          do{
            opcion=toupper(getch());
          }while(!isalpha(opcion));
          cout<<opcion;
           if(opcion=='N'||opcion=='S')salir=1;
            else salir=0;
          }while(salir!=1);
          if(opcion=='S'){dat_reservados.encolar(aux->valor,datos);
         
          cout<<"edad"<<aux->valor.edad_disenho<<endl;
          cout<<"tipo"<<aux->valor.tipo_protesis<<endl;
          getch();
           Borrar(aux->valor.edad_disenho,datos.tipo_protesis); //aqui no se si llama asi o con el nombre del tipo de lista,
// pero al ejecutar me da desboramiento de la pila en la linea
//donde esta el if que busca la coincidencia de los datos

          }
         


          band=1;
          getch();
      }//del if
      aux=aux->siguiente;
   }//del while
   if(band==0){
     cout<<"\n\n\tNo hay protesis disponible";
         getch();
   }
}