ayuda para eliminar un dato de una agenda, en c

Iniciado por alexander-pedro, 11 Julio 2013, 19:19 PM

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

alexander-pedro

pasa que estoy creando una agenda en c,
y necesito eliminar una dato, ingresando el nombre de algun contacto.
como le hago?
hasta esto momentos llevo esto:


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>

struct agenda{
   char nombre[200];
   char telefono[12];
   char cedula[20];
   struct agenda*sig;
}*princ, *fin;
int j=0;

void agregar(){
   struct agenda*nuevo;
   nuevo=(struct agenda*)malloc(sizeof(struct agenda));
   printf("\ndigite su nombre: ");
   fflush(stdin);
   scanf("%s", nuevo->nombre);
   fflush(stdin);
   printf("digite su telefono: ");
   scanf("%s", nuevo->telefono);
   printf("digite su cc: ");
   fflush(stdin);
   scanf("%s", nuevo->cedula);
   nuevo->sig=NULL;

   if(princ==NULL){
      princ=nuevo;
      fin=nuevo;
   }
   else{
      fin->sig=nuevo;
      fin=nuevo;
   }
      j++;

}

void imprimir(){
    printf("\nDATOS AGREGADOS HASTA EL MOMENTO\n");
   struct agenda*aux;
   aux=princ;

   if(aux==NULL){
      printf("agenda vacia vacia");
   }
   else{
      while(aux!=NULL){

         printf("\nnombre: %s", aux->nombre);
         printf("\ntelefono: %s",aux->telefono);
         printf("\ncedula: %s", aux->cedula);
         printf("\n--------------------------------------------\n");
         aux=aux->sig;
      }
   }
}

void eliminar(){
   struct agenda*aux;
   struct agenda*aux1;
   
   int cont;
   aux=princ;
   aux=princ;

   cont=0;
   printf("digite el nombre a eliminar");

   while(aux!=NULL){
      if(aux->nombre==aux1->nombre){
         if(cont==0){
            princ=princ->sig;
         }
      }
      aux=aux->sig;
      aux1=aux;
      cont=1;
   }

}

int main(){
   int opc;
   do{
      printf("\n1. ingresar datos a la agenda\n");
      printf("2. mostrar los datos de la agenda\n");
      printf("3. eliminar datos de la agenda\n");
      printf("4. eliminar\n");
      printf("\nintroduce una opcion: ");
      scanf("%d", &opc);
      system("cls");

      switch(opc){
         case 1:
            agregar();
            break;

         case 2:
            imprimir();
            break;

         case 3:
            eliminar();
            break;
         case 4:
            printf("salir");
         break;
      }
   }while(opc<4);
}

Stakewinner00

y si escribes los datos en un archivo y luego lo eliminas del archivo?

eferion

A ver, con la estructura agenda vas a tener una lista enlazada, si lo representamos gráficamente, después de tener varios contactos la estructura sería la siguiente:

agenda ( sig -> ) agenda ( sig -> ) agenda ...

Si lo representamos con números para poder explicarlo mejor quedaría así:

agenda0 ( sig -> ) agenda1 ( sig -> ) agenda2 ...

Esto básicamente quiere decir que tienes un elemento agenda0 cuyo puntero sig apunta al elemento agenda1 y así.

Si quieres eliminar agenda1 tendrías que conseguir que el sig de agenda0 apunte a agenda2 en vez de a agenda1. Y después, como buena práctica, hay que eliminar agenda1 para que no deje lagunas de memoria.

Los pasos serían más o menos estos:


struct agenda* anterior = 0;
struct agenda* actual = princ;

while ( actual != 0 )
{
    if ( [actual es el elemento a eliminar] )
    {
      struct agenda* siguiente = actual->sig;
      free( actual );

      if ( anterior != 0 )
        anterior->sig = siguiente;
      else
        princ = siguiente; // Estamos borrando el primer elemento de la agenda

      if ( siguiente == 0 )
        fin = anterior; // Estamos borrando el último elemento de la agenda.
    }

    anterior = actual;
    actual = actual->sig;
}



aguml

En tu codigo veo un fallo:
if(aux->nombre==aux1->nombre){
No puedes comparar dos arrays de caracteres asi, tienes que usar strcmp o strncmp.

mr.blood


void eliminar(){
   struct agenda*aux;
   struct agenda*aux1;
   
   int cont;
   aux=princ;
   aux=princ;

   cont=0;
   printf("digite el nombre a eliminar");

   while(aux!=NULL){
      if(aux->nombre==aux1->nombre){
         if(cont==0){
            princ=princ->sig;
         }
      }
      aux=aux->sig;
      aux1=aux;
      cont=1;
   }

}


Que demonios es eso?

No pides el nombre a eliminar, comparas cadenas con ==...

Sa1uDoS

aguml