Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: alexander-pedro en 11 Julio 2013, 19:19 pm



Título: ayuda para eliminar un dato de una agenda, en c
Publicado por: alexander-pedro en 11 Julio 2013, 19:19 pm
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);
}


Título: Re: ayuda para eliminar un dato de una agenda, en c
Publicado por: Stakewinner00 en 11 Julio 2013, 22:26 pm
y si escribes los datos en un archivo y luego lo eliminas del archivo?


Título: Re: ayuda para eliminar un dato de una agenda, en c
Publicado por: eferion en 12 Julio 2013, 09:41 am
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:

Código
  1. struct agenda* anterior = 0;
  2. struct agenda* actual = princ;
  3.  
  4. while ( actual != 0 )
  5. {
  6.    if ( [actual es el elemento a eliminar] )
  7.    {
  8.      struct agenda* siguiente = actual->sig;
  9.      free( actual );
  10.  
  11.      if ( anterior != 0 )
  12.        anterior->sig = siguiente;
  13.      else
  14.        princ = siguiente; // Estamos borrando el primer elemento de la agenda
  15.  
  16.      if ( siguiente == 0 )
  17.        fin = anterior; // Estamos borrando el último elemento de la agenda.
  18.    }
  19.  
  20.    anterior = actual;
  21.    actual = actual->sig;
  22. }



Título: Re: ayuda para eliminar un dato de una agenda, en c
Publicado por: aguml en 15 Julio 2013, 11:43 am
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.


Título: Re: ayuda para eliminar un dato de una agenda, en c
Publicado por: mr.blood en 15 Julio 2013, 12:24 pm
Código
  1. void eliminar(){
  2.   struct agenda*aux;
  3.   struct agenda*aux1;
  4.  
  5.   int cont;
  6.   aux=princ;
  7.   aux=princ;
  8.  
  9.   cont=0;
  10.   printf("digite el nombre a eliminar");
  11.  
  12.   while(aux!=NULL){
  13.      if(aux->nombre==aux1->nombre){
  14.         if(cont==0){
  15.            princ=princ->sig;
  16.         }
  17.      }
  18.      aux=aux->sig;
  19.      aux1=aux;
  20.      cont=1;
  21.   }
  22.  
  23. }

Que demonios es eso?

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

Sa1uDoS


Título: Re: ayuda para eliminar un dato de una agenda, en c
Publicado por: aguml en 16 Julio 2013, 11:00 am
verdad, tampoco pides el nombre.