quien me puede ayudar en el error

Iniciado por geshiro, 15 Junio 2015, 01:44 AM

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

geshiro

quien me puede ayudar en el error de la parte de eliminar


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#include <string.h>
/*malloc-free-alloc-realloc unsigned*/
struct nodo{//DEFINE LA ESTRUCTURA
char nombre[128];
char fecha[10];
int cuenta;
float saldo;
struct nodo  *ant, *sig; //SE CREA EL APUNTADOR DEL TAMAÑO DE UN NODO SIMILAR
};
typedef struct nodo NODO;//DEFINE TIPO DE DATO A PARTIR DE LA ESTRUCTURA DE nodo
typedef NODO *NODOPTR;//DEFINE UN TIPO DE APUNTADOR BASADO EN EL TAMAÑO DE NODO
int isEmpty(NODOPTR cima){//RECIBE LA CIMA PARA LA COMPARACION
return (cima == NULL);
}
void add(NODOPTR * cima,char nombre[128],char fecha[10],int cuenta,float saldo){
system("cls");
NODOPTR nuevo;//APUNTADOR PARA EL NUEVO DATO
NODOPTR actual;//APUNTADOR TEMPORAL QUE SE UTILIZA CUANDO EXISTE AL MENOS UN DATO
nuevo = (NODO *) malloc(sizeof(NODO));//REGRESA LA DIRECCION DE UN BLOQUE DE MEMORIA EN EL CUAL SE ASIGNARAN LOS VALORES
if(nuevo==NULL){
printf("No se puede agregar");
}else{
if(isEmpty(*cima)){//SE ASIGNAN LOS VALORES RECIBIDOS POR LA FUNCION
strcpy(nuevo->nombre,nombre);
strcpy(nuevo->fecha,fecha);
nuevo->cuenta = cuenta;
nuevo->saldo = saldo;
nuevo->sig = NULL;//SE ASIGNA NULO POR QUE EL PRIMERO
*cima = nuevo;//AL SER EL PRIMERO SE ESTABLECE COMO LA CIMA
}else{
actual = *cima;//SE ALMACENA EL APUNTADOR DE LA CIMA ACTUAL
while(actual->sig != NULL){//SE RECORREN TODOS LOS ELEMENTOS DE LA COLA HASTA ENCONTRAR UN VALOR "NULL" EN LA PROPIEDAD DE SIGUIENTE
actual = actual->sig;//SE ASIGNA LA ESTRUCTURA SIGUIENTE A LA ACTUAL
}
strcpy(nuevo->nombre,nombre);
strcpy(nuevo->fecha,fecha);
nuevo->cuenta = cuenta;
nuevo->saldo = saldo;
nuevo->sig = NULL;
actual->sig = nuevo;//SE ASIGNA EL APUNTADOR DEL NUEVO ELEMENTO AL ULTIMO
}
}
}
void remove(NODOPTR *cima){//RECIBE EL APUNTADOR DONDE SE ENCUENTRA LA CIMA
NODOPTR temp;//SE CREA UN NODO TEMPORAL
temp = *cima;//ALMACENA EL APUNTADOR DE LA CIMA
*cima = (*cima)->sig;//SE ALMACENA EL APUNTADOR DEL SIGUIENTE ELEMENTO EN LA LOCACION DE LA CIMA
free(temp);//SE LIBERA LA LOCACION DE MEMORIA TEMPORAL DONDE SE ENCONTRABA LA CIMA ACTUAL
}
void show(NODOPTR cima){//RECIBE LA CIMA
system("cls");
if(cima == NULL){
printf("La cola esta vacia");
}else{
while(cima != NULL){//RECORRE HASTA ENCONTRAR EL ULTIMO ELEMENTO
printf("-----------------------------------------------------\n");
printf("Numero de cuenta:%d\n",cima->cuenta);
printf("Nombre:%s\n",cima->nombre);
printf("Fecha de nacimiento:%s\n",cima->fecha);
printf("Saldo:%f:\n",cima->saldo);
cima = cima->sig;//SE ASIGNA EL SIGUIENTE A LA CIMA ACTUAL
}
}
getch();
}
int find(NODOPTR cima,int cuenta){//RECIBE LA CIMA
int found = 0;
if(cima == NULL){
printf("La cola esta vacia");
}else{
while(cima != NULL){//RECORRE HASTA ENCONTRAR EL ULTIMO ELEMENTO
if(cima->cuenta == cuenta){
found = 1;
break;
}
cima = cima->sig;//SE ASIGNA EL SIGUIENTE A LA CIMA ACTUAL
}
}
return found;
}
int edit(NODOPTR cima,int cuenta,char nombre[128],char fecha[10]){//RECIBE LA CIMA
int success = 0;
if(cima == NULL){
printf("La cola esta vacia");
}else{
while(cima != NULL){//RECORRE HASTA ENCONTRAR EL ULTIMO ELEMENTO
if(cima->cuenta == cuenta){
strcpy(cima->nombre,nombre);
strcpy(cima->fecha,fecha);
success = 1;
break;
}
cima = cima->sig;//SE ASIGNA EL SIGUIENTE A LA CIMA ACTUAL
}
}
return success;
}
int deposito(NODOPTR cima,int cuenta,int cantidad){//RECIBE LA CIMA
int success = 0;
if(cima == NULL){
printf("La cola esta vacia");
}else{
while(cima != NULL){//RECORRE HASTA ENCONTRAR EL ULTIMO ELEMENTO
if(cima->cuenta == cuenta){
cima->saldo+=cantidad;
success = 1;
break;
}
cima = cima->sig;//SE ASIGNA EL SIGUIENTE A LA CIMA ACTUAL
}
}
return success;
}
int retirar(NODOPTR cima,int cuenta,int cantidad){//RECIBE LA CIMA
int success = 0;
if(cima == NULL){
printf("La cola esta vacia");
}else{
while(cima != NULL){//RECORRE HASTA ENCONTRAR EL ULTIMO ELEMENTO
if(cima->cuenta == cuenta){
if(cima->saldo>=cantidad){
cima->saldo-=cantidad;
success = 1;
break;
}else
printf("No cuenta con el saldo suficiente\n");
}
cima = cima->sig;//SE ASIGNA EL SIGUIENTE A LA CIMA ACTUAL
}
}
return success;
}
//RETORNO DE APUNTADOR
NODOPTR findptr(NODOPTR cima,int cuenta){//RECIBE LA CIMA
NODOPTR found = NULL;
if(cima == NULL){
printf("La cola esta vacia");
}else{
while(cima != NULL){//RECORRE HASTA ENCONTRAR EL ULTIMO ELEMENTO
if(cima->cuenta == cuenta){
found = cima;
break;
}
cima = cima->sig;//SE ASIGNA EL SIGUIENTE A LA CIMA ACTUAL
}
}
return found;
}

int borrar(NODOPTR *ptr,int cuenta,NODOPTR *sig)
{
NODOPTR antesptr, actualptr, tempptr;
if(cuenta == (*ptr)-> cuenta)
{
tempptr = *ptr;
*ptr = (*ptr)->sig;
(*ptr)-> ant = NULL;
free(tempptr);
return cuenta;
}
else
{
antesptr = *ptr;
actualptr = (*ptr)->sig;
while(actualptr != NULL && actualptr->cuenta != cuenta)
{
antesptr = actualptr;
actualptr = actualptr->sig;
}
if(actualptr != NULL)
{
tempptr = actualptr;
antesptr->sig = actualptr->sig;
actualptr = actualptr->sig;
actualptr->ant = antesptr;
free(tempptr);

        return cuenta;
}
}
return -1;
}






int main()
{
NODOPTR cima = NULL;
NODOPTR inicio = NULL, actual = NULL;
/*NODOPTR cuenta_1 = NULL;
NODOPTR cuenta_2 = NULL;*/
int cuenta_1,cuenta_2;
int x = 0;
//Variables
char nombre[128];
char fecha[10];
int cuenta;
float cantidad;
strcpy(nombre,"Roberto");
strcpy(fecha,"1991-06-07");
add(&cima,nombre,fecha,1,1000.00);
strcpy(nombre,"Saul");
strcpy(fecha,"1996-09-30");
add(&cima,nombre,fecha,2,1900.00);
//show(cima);
/*cuenta_1 = findptr(cima,1);
cuenta_2 = findptr(cima,2);
printf("%f\n",cuenta_1->saldo);
printf("%f\n",cuenta_2->saldo);
return 0; */
do{
system("cls");
printf("Seleccione una opcion\n");
printf("1.Agregar\n");
printf("2.Modificar\n");
printf("3.Desplegar cuentas\n");
printf("4.Deposito\n");
printf("5.Retiro\n");
printf("6.Transferencia\n");
printf("7.Eliminar\n");
printf("0.Salir\n");
scanf("%d",&x);
switch(x){
case 1:
system("cls");
printf("Ingrese el nombre del titular:\n");
fflush(stdin);
gets(nombre);//fgets(nombre,sizeof(nombre),stdin);
system("cls");
printf("Ingrese la fecha de nacimiento del titular:\n");
fflush(stdin);
gets(fecha);//fgets(fecha,sizeof(fecha),stdin);
do{
system("cls");
printf("Ingrese el numero de cuenta del titular:\n");
scanf("%d",&cuenta);
}while(find(cima,cuenta)==1);
add(&cima,nombre,fecha,cuenta,0.00);
system("pause");
break;
case 2:
do{
system("cls");
printf("Ingrese el numero de cuenta:\n");
scanf("%d",&cuenta);
}while((find(cima,cuenta))==0);
if(cuenta != 0){
system("cls");
printf("Ingrese el nombre del titular:\n");
fflush(stdin);
gets(nombre);
system("cls");
printf("Ingrese la fecha de nacimiento del titular:\n");
fflush(stdin);
gets(fecha);
if(edit(cima,cuenta,nombre,fecha)==1)
printf("Sus datos fueron almacenados\n");
else
printf("Hubo un error al almacenar sus datos\n");
}
system("pause");
break;
case 3:
show(cima);
system("pause");
break;
case 4:
do{
system("cls");
printf("Ingrese el numero de cuenta:\n");
scanf("%d",&cuenta);
}while((find(cima,cuenta))==0);
if(cuenta != 0){
system("cls");
printf("Ingrese la cantidad a depositar:\n");
scanf("%f",&cantidad);
if(deposito(cima,cuenta,cantidad)==1)
printf("Deposito realizado con exito\n");
else
printf("Hubo un error al depositar\n");
}
system("pause");
break;
case 5:
do{
system("cls");
printf("Ingrese el numero de cuenta:\n");
scanf("%d",&cuenta);
}while((find(cima,cuenta))==0);
if(cuenta != 0){
system("cls");
printf("Ingrese la cantidad a retirar:\n");
scanf("%f",&cantidad);
if(retirar(cima,cuenta,cantidad)==1)
printf("Retiro realizado con exito\n");
else
printf("Hubo un error al retirar\n");
}
system("pause");
break;
case 6:
do{
system("cls");
printf("Ingrese el numero de cuenta benefactora:\n");
scanf("%d",&cuenta_1);
}while((find(cima,cuenta_1))==0);
do{
system("cls");
printf("Ingrese el numero de cuenta beneficiario:\n");
scanf("%d",&cuenta_2);
}while((find(cima,cuenta_2))==0);
if(cuenta_1 != 0 && cuenta_2 != 0){
system("cls");
printf("Ingrese la cantidad a transferir:\n");
scanf("%f",&cantidad);
if(retirar(cima,cuenta_1,cantidad)==1){
if(deposito(cima,cuenta_2,cantidad))
printf("Transferencia realizada con exito\n");
}else
printf("Hubo un error al retirar\n");
}
system("pause");
break;
case 7:
  if(!isEmpy(inicio))
{
printf("\n Cual cuenta sera borrado ?");
scanf("%d",&cuenta);
if(borrar(&actual,cuenta,&actual))
{
printf("\n %d ha sido borrado",cuenta);
show(cima);
}
else
printf("\n %d no pudo ser borrado",cuenta);
}
else
printf("\n La lista esta vacia ");
getch();
  break;
}
}while(x!=0);

return 0;
}

ivancea96