Urgente apuntadores

Iniciado por IrvWinchester, 3 Agosto 2017, 11:10 AM

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

IrvWinchester

Hola, soy nuevo en el foro, recurrí porque no encuentro solución a mi problema por más que navegué e intenté por mi mismo y me siento un poco frustrado; les comento, estoy realizando una agenda que por el momento tiene las siguientes funciones: agregar, buscar, eliminar.

Actualmente todo me funciona de maravilla, excepto en eliminar, sólo logro que elimine el primero elemento, a partir del segundo en adelante me marca errores y me saca de la ejecución del programa, les adjunto el código, compilo en Borland.


int eliminar(){
agenda *temp = primero;
  char pal_clave[100];
  gets(bas); //variable para almacenar la tecla intro
  printf("\n Dame el nombre completo de la persona a borrar: ");
  gets(pal_clave);

  //este ciclo recorre la agenda hasta encontrar el nombre
  do{
  //si la palabra clave a buscar coincide con el nombre
  if(strcmp(pal_clave,temp->nombre) == 0){
    //si es la primera en la lista
  if (temp == primero){
        //si no tiene registro en su campo siguiente
        if(temp->sig== NULL){
            primero = NULL;
    ultimo = NULL;
              free(temp);
    }
           else{
    //si tiene registros en su campo siguiente, este se asigna al primero
            primero=temp->sig;
    primero->ant = NULL;
    }
return true;
    }

    if(temp == ultimo){
        ultimo = temp->ant;
           ultimo -> sig = NULL;
           free(temp);
           return true;
    }
    temp->ant->sig=temp->sig;
    temp->sig->ant = temp->ant;
    //libero espacio en memoria del registro borrado
    free(temp);
    return true;
    }
     //avanza al siguiente en la lista
    temp = temp->sig;
}
  while(temp != NULL);
return false;
}

SubAtomicParticula

Saludos IrvWinchester:

El error lo tienes en la funcion agregar(), te indico el codigo modificado que funciona:

void agregar(){
   agenda *nuevo;
   nuevo = (agenda *)malloc(sizeof(agenda));         //reservando la memoria

----------------------------
   nuevo->sig= NULL;

   if(primero==NULL){
      primero=nuevo;
      ultimo=nuevo;
      // FALTA NULL A PUNTERO ANTERIOR
      nuevo->ant = NULL;
   }
   else{
      ultimo->sig=nuevo;
      // FALTA ASIGNAR EL PUNTERO ANTERIOR para en nuevo elemento
      nuevo->ant = ultimo;
      ultimo=nuevo;
   }
-------------------------------
}

Espero haberte ayudado. Un saludo.

IrvWinchester

Gracias, sirvió de maravilla! Era algo que estaba pasando por alto!