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);
}
y si escribes los datos en un archivo y luego lo eliminas del archivo?
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;
}
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.
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
verdad, tampoco pides el nombre.