• Sábado 18 de Mayo de 2024, 19:21

Autor Tema:  Error De Ejecución En Memoria  (Leído 2805 veces)

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Error De Ejecución En Memoria
« en: Lunes 6 de Diciembre de 2004, 20:05 »
0
Hola a todos, estoy desesperada, tengo que ahcer una practica de listas, y he optado por ir haciendo poco a poco, función a función, resulta que me compila, pero me da un error de ejecución en memoria, en las funciones InsertarporApellido1 y borrarporApellido1, asi que voy a a poner el enunciado de la práctica, y el código que yo he hecho, por si alguien puede ayudarme, gracias.Solo he puesto el codigo necesario para que funcionen estas funciones.

El codigo es este: adjunto el de listas. h y listas. C
Código: Text
  1.  
  2. #include "listas.h"
  3.  
  4. /* Programa principal */
  5. main()
  6. {
  7.  struct lista *existe;
  8.  struct lista *cabeza;
  9.  char nombre[15];
  10.  char ape1[20];
  11.  char ape2[20];
  12.  int edad = 0;
  13.  int opcion;
  14.  char resp;
  15.  
  16.   /* opciones */
  17. do{
  18.   
  19.  crearLista(&cabeza);
  20.      
  21.     
  22.   do{
  23.       cogerDatosTexto(&cabeza);
  24.       printf("\n La lista enlazada es asi: \n\n");
  25.     mostrarLista(cabeza);  
  26.     presentaMenu();
  27.     printf("Introduce una opcion: ");
  28.      scanf("%d",&opcion);
  29.      fflush(stdin);
  30.   
  31.     
  32.  }while(opcion <0 || opcion > 11);
  33.       
  34.   
  35.  
  36.       switch(opcion)
  37.       {
  38.   
  39.       
  40.      case 3: /*Insertar por apellido1*/
  41.         introducirDatos(nombre, ape1, ape2, edad);  
  42.         /*comprobamos si existe la persona*/
  43.               existe = buscarPersona(cabeza, ape1);
  44.       
  45.       if(!existe)
  46.       {
  47.             do
  48.            {
  49.             insertarPorApellido1(&cabeza, nombre, ape1, ape2, edad);            printf("\n\n¿Desea introducir otra persona? (S/N): ");
  50.             scanf("%c", &resp);
  51.             system("clear");
  52.            }while(resp == 's' || resp =='S');
  53.        mostrarLista(cabeza);
  54.        getchar();
  55.     }
  56.          
  57.     else
  58.        printf("\n Esta persona ya existe");
  59.          visualizarNodo(existe);
  60.            getchar();
  61.            getchar();
  62.     
  63.       break;
  64.  
  65.      case 4: /*Borrar por apellido1*/
  66.          printf("\n Introduzca el apellido a borrar: ");
  67.          gets(ape1);
  68.         
  69.      //comprobamos si la persona existe
  70.         existe = buscarPersona(cabeza, ape1);
  71.  
  72.        if(existe) //si existe
  73.        {
  74.           borrarPorApellido1(&cabeza, ape1);
  75.         printf("\n Elemento borrado");
  76.          mostrarLista(cabeza);
  77.        }    
  78.       else
  79.        printf("\n Elemento no encontrado\n");
  80.  
  81.      getchar();
  82.      getchar();
  83.      break;
  84.     
  85.   
  86.   
  87.       } //cierre del switch
  88.    }while (opcion);  /* opcion != 0 */
  89.  }
  90.  
  91. /************************ Función crear() ***************************/
  92. /*
  93.    Propósito..: Crea la lista.
  94.    Parámetros.: Puntero cabeza de lista por referencia.
  95.    Devuelve...: Nada.
  96. */
  97. /********************************************************************/
  98.  
  99. void crearLista(struct lista **cabeza)
  100. {
  101.       *cabeza = NULL;
  102.     
  103. }
  104.  
  105.  void presentaMenu(void)
  106. {
  107.    printf("EJEMPLO DE LISTA ENLAZADA\n");
  108.    printf("-------------------------\n\n");
  109.      printf("1.- Insertar al Principio\n");
  110.      printf("2.- Insertar al Final\n");
  111.      printf("3.- Insertar por apellido1\n");
  112.      printf("4.- Borrar por apellido 1\n");
  113.      printf("5.- Visualizar por apellido1 \n");
  114.      printf("6.- Visualizar cabeza cola\n");
  115.      printf("7.- Visualizar cola cabeza\n");
  116.      printf("8.- Liberar Memoria\n");
  117.      printf("9.- Liberar Memoria Recursivo\n");
  118.      printf("10.- Grabar Lista\n");
  119.      printf("0.- TERMINAR.\n\n\n");
  120. }
  121.     
  122.  /******************************Funcion nuevoElemento****************/
  123. /*Funcion que sirve para reservar espacio para un nuevo elemento*/
  124.  
  125. struct lista* nuevoElemento()
  126. {
  127.     struct lista *a;
  128.     a = (struct lista*)malloc(sizeof(struct lista));
  129.     return a;
  130. }
  131.  
  132.  
  133. /************************ Función vacia() ***************************/
  134. /*
  135.    Propósito:  Comprueba si la lista está vacía.
  136.    Parámetros: Puntero cabeza de lista por valor.
  137.    Devuelve:   1 si la lista está vacía.
  138.                0 si no lo está.
  139. */
  140. /********************************************************************/
  141. int listaVacia(struct lista *cabeza)
  142. {
  143.    if (cabeza==NULL)
  144.       return SI;    /* verdad */
  145.    else
  146.       return NO;    /* falso */
  147. }
  148.  
  149.  
  150. //FUNCION BUSCAR PERSONA
  151.  
  152.   struct lista* buscarPersona(struct lista *cabeza, char *ape1)
  153.   {
  154.         
  155.     struct lista *existe;
  156.   existe = cabeza;
  157.  
  158.     if (listaVacia(cabeza) == SI)
  159.     {
  160.       printf("\n La lista esta vacia.\n");
  161.       
  162.     }
  163.  
  164.     //se recorre la lista hasta encontar el elemento o hasta llegar al final
  165.     while(existe!=NULL)
  166.     {
  167.         if(strcmp(existe->ape1, ape1)== 0)
  168.     {  
  169.       return existe;
  170.     
  171.         }  
  172.         else{
  173.            existe= existe->sig;
  174.     }
  175.   }
  176.   return (NULL);
  177.  
  178. }        
  179.  
  180. void introducirDatos(char *nombre, char *ape1, char *ape2, int edad)
  181. {
  182.           printf("\n Introduzca el nombre => ");
  183.       gets(nombre);
  184.       fflush(stdin);
  185.   
  186.           printf("\nIntroduzca el apellido1 => ");
  187.           gets(ape1);
  188.           fflush(stdin);
  189.         
  190.   
  191.           printf("\nIntroduzca el apellido2 => ");
  192.           gets(ape2);
  193.           fflush(stdin);
  194.         
  195.   
  196.           printf("\nIntroduzca la edad => ");
  197.           scanf("%d",&edad);
  198.           fflush(stdin);
  199.         
  200. }
  201.  
  202. void mostrarLista(struct lista *cabeza)
  203. {
  204.   struct lista *actual;
  205.   actual = cabeza;
  206.  
  207.   while(actual!=NULL)
  208.   {
  209.   printf("%s %s %s %d \n",actual->nombre,actual->ape1,actual->ape2,actual->edad);
  210.   actual = actual->sig;
  211.   }
  212.   printf("\n");
  213.   
  214. }
  215.  
  216. void visualizarNodo(struct lista *nodo)
  217. {
  218.          printf("\n Nombre.....: %s"
  219.                 "\n Apellido1......: %s"
  220.                 "\n Apellido2.....: %s"
  221.                 "\n Edad.....: %d \n",nodo->nombre,nodo->ape1,nodo->ape2,nodo->edad);
  222. }
  223.  
  224. //Esta funcion sirve para insertar por orden alfabetico el primer apellido
  225.  
  226. void insertarPorApellido1(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad)
  227. {
  228.    struct lista *aux=NULL; //almacena elemento posterior al que se inserta
  229.    struct lista *ant =NULL; //almacena elemento anterior al que se inserta
  230.    struct lista *nuevo = NULL; //almacena el nuevo elemento
  231.    int encontrado  = 0;
  232.   
  233.    //Se reserva espacio para el nuevo elemento
  234.   nuevo = nuevoElemento();
  235.   strcpy(nuevo->nombre, nombre);
  236.   strcpy(nuevo->ape1, ape1);
  237.   strcpy(nuevo->ape2, ape2);
  238.   nuevo->edad = edad;
  239.  
  240.    if(listaVacia(*cabeza) == SI) //comprueba si la lista esta vacia
  241.    {
  242.   
  243.   *cabeza = nuevo; //la cabeza será el nuevo elemento
  244.   nuevo->sig = NULL;
  245.    }
  246.  
  247.    else{
  248.      aux = *cabeza;
  249.      if(strcmp(aux->ape1, ape1)>0 ) //nuevo elemento se inserta delante de
  250.                                         //la cabeza
  251.        {
  252.         nuevo->sig=*cabeza; //El siguiente de nuevo será la cabeza
  253.        *cabeza=nuevo;
  254.        }
  255.      else //buscamos la posicion de insercion, se interrumpe cuando se
  256.      //encuentra el primer elemento mayor que n o cuando se llega al final de la lista
  257.          {
  258.   
  259.               while(aux!=NULL && encontrado == 0) {
  260.                    if( strcmp( aux->ape1, ape1 ) >=0 ) //hemos encontrado la posicion de insercion
  261.                     {
  262.                       encontrado = 1;
  263.                      break;
  264.                     
  265.                      }
  266.                    else //se actualizan los valores de ayx y ant
  267.                        {
  268.                        ant=aux;
  269.                        aux=aux->sig;
  270.                        }
  271.  
  272.              }
  273.         if(aux == NULL){  //el elemento se inserta al final
  274.                 ant->sig = nuevo;    
  275.         nuevo->sig = aux;
  276.         }
  277.    }
  278.    }
  279.  
  280. }
  281.  
  282. void borrarPorApellido1(struct lista **cabeza, char *ape1)
  283. {
  284.  struct lista *ant = NULL; //almacena el elemento anterior al que se borra
  285.  struct lista *borrar;  //almacena el elemento a borrar
  286.  borrar = *cabeza;
  287.  
  288. if (listaVacia(*cabeza) == SI)
  289. {
  290.       printf("\n La lista esta vacia.\n");
  291.     exit (0);
  292. }
  293.  
  294. while(borrar != NULL)
  295.      {
  296.     if(!strcmp(ape1, borrar->ape1)) break;
  297.             
  298.       else{ //si son distintos
  299.              ant = borrar;
  300.              borrar = borrar->sig;
  301.             }
  302.      }
  303.   
  304. if (strcmp(ape1, (*cabeza)->ape1) == 0 ) //el elemento a borrar es cabeza
  305.         {
  306.          *cabeza = borrar->sig;
  307.          free(borrar); //se libera la antigua cabeza
  308.         }
  309.   
  310.       //el elemento a borrar no es la cabeza
  311.      if (borrar != NULL)    //Si borrar es distinto de NULL
  312.       {
  313.      if(borrar == *cabeza)
  314.      {
  315.        *cabeza = borrar->sig;
  316.        free(borrar);
  317.      }
  318.       else //si el elemento a borrar no es la cabeza  
  319.       {
  320.             ant->sig = borrar->sig;;
  321.            free(borrar);
  322.       }
  323.    }
  324.       printf("\n\n El apellido ha sido borrado\n");
  325.          fflush(stdin);
  326.          getchar();
  327. }
  328.  
  329. /*listas.h*/
  330. /*Declaracion de estructuras y funciones*/
  331.  
  332. #include <stdio.h>
  333. #include <stdlib.h>
  334. #include <string.h>
  335. #include <malloc.h>
  336. #define SI 1
  337. #define NO 0
  338.  
  339. struct lista
  340. {
  341.     char nombre[15];
  342.     char ape1[15];
  343.     char ape2[15];
  344.     int edad;
  345.     struct lista *sig;
  346. };
  347. struct lista *nuevo;
  348.  
  349. void cogerDatosTexto(struct lista **cabeza);
  350.  
  351. void introducirDatos(char *nombre, char *ape1, char *ape2, int edad);
  352.  
  353. struct lista* nuevoElemento();
  354. void presentaMenu(void);
  355. void crearLista(struct lista **cabeza);
  356. int listaVacia(struct lista *cabeza);
  357. void insertarPrincipio(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad);
  358. void visualizarNodo(struct lista *nodo);
  359.  
  360. void mostrarLista(struct lista *cabeza);
  361. void insertarFinal(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad);
  362. void insertarPorApellido1(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad);
  363.  
  364.  
  365. visualizarpersona(struct lista *cabeza, char *nombre);
  366. void visualizarPorApellido1(struct lista *cabeza,char *ape1);
  367. struct lista* buscarPersona(struct lista *cabeza, char *ape1);
  368. void visualizarCabezaCola(struct lista *cabeza);
  369. void visualizarColaCabeza(struct lista *cabeza);
  370. void liberarMemoria(struct lista **cabeza);
  371. void liberarMemoriaRecursivo(struct lista **cabeza);
  372. void grabarLista(struct lista *cabeza, char *fichero);
  373. void borrarPorApellido1(struct lista **cabeza, char *ape1);
  374.  
  375.  

Gracias a todos,  :)
Si Juank, ve esto, que sepa q solo me refiero a la funcion borrarPorApellido1
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Error De Ejecución En Memoria
« Respuesta #1 en: Martes 7 de Diciembre de 2004, 04:53 »
0
Hola,
quisiera ayudarte pero no gtengo mucho tiempo como para revisar todo tu codigo.

Seria mejor si tratas de delimitar el problema a u solo segmento de codigo y no al programa en general.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Error De Ejecución En Memoria
« Respuesta #2 en: Jueves 9 de Diciembre de 2004, 16:18 »
0
hola, creo que habia un nuevo mensaje tuyo pero se borro por los problemas del lunes, podrias volverlo a postear por favor?
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Error De Ejecución En Memoria
« Respuesta #3 en: Viernes 10 de Diciembre de 2004, 20:46 »
0
Cita de: "JuanK"
hola, creo que habia un nuevo mensaje tuyo pero se borro por los problemas del lunes, podrias volverlo a postear por favor?
Hola Juank, he visto tu mensaje, y te digo que por favor, si puedes ayudarme leas de nuevo lo que he colgado en el foro, necesito ayuda para dos de las funciones, asi que solo he puesto el codigo necesario,para las mismas.De todos modos, si tienes interes en ayudarme, te daré mi correo. Es que esto es muy importante, tengo examen el lunes, y me juego la nota.
gRACIAS
 :hola:

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Error De Ejecución En Memoria
« Respuesta #4 en: Viernes 10 de Diciembre de 2004, 21:42 »
0
por favor anexa el codigo completo y cuantame que has logrado revisar del problema y donde crees que sta el error.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Error De Ejecución En Memoria
« Respuesta #5 en: Viernes 10 de Diciembre de 2004, 22:28 »
0
Cita de: "JuanK"
por favor anexa el codigo completo y cuantame que has logrado revisar del problema y donde crees que sta el error.
Lo primero rgracias por responderme, eeres el unico, te voy a adjuntar el codigo que llevo hecho hasta ahora.

Código: Text
  1.  
  2. /*listas.c*/
  3. #include "listas.h"
  4.  
  5. /* Programa principal */
  6. main()
  7. {
  8.  struct lista *existe;
  9.  struct lista *cabeza;
  10.  char nombre[15];
  11.  char ape1[20];
  12.  char ape2[20];
  13.  int edad = 0;
  14.  int opcion;
  15.  char resp;
  16.  char fichero[35];
  17.  
  18.   /* opciones */
  19. do{
  20.  
  21.  crearLista(&cabeza);
  22.      
  23.    
  24.   do{
  25.       cogerDatosTexto(&cabeza);
  26.       printf("\n La lista enlazada es asi: \n\n");
  27.     mostrarLista(cabeza);  
  28.     presentaMenu();
  29.     printf("Introduce una opcion: ");
  30.      scanf("%d",&opcion);
  31.      fflush(stdin);
  32.    
  33.    
  34.  }while(opcion <0 || opcion > 11);
  35.      
  36.    
  37.  
  38.       switch(opcion)
  39.       {
  40.    
  41.       case 1: /*Insercion al principio*/
  42.         introducirDatos(nombre, ape1, ape2, edad);      
  43.      /*comprobamos si existe la persona*/
  44.       existe = buscarPersona(cabeza, ape1);
  45.  
  46.       if(!existe) //existe == NULL
  47.       {
  48.        do{
  49.        insertarPrincipio(&cabeza, nombre,ape1, ape2,edad);
  50.                printf("\n Persona insertada");
  51.              printf("\n\n¿Desea introducir otra persona? (S/N): ");
  52.                          scanf("%c", &resp);
  53.                        
  54.               }while(resp == 's' || resp =='S');
  55.  
  56.      mostrarLista(cabeza);
  57.      getchar();
  58.  
  59.        
  60.        }
  61.        else
  62.          printf("\n Esta persona ya existe");
  63.        visualizarNodo(existe);
  64.          getchar();
  65.          getchar();
  66.    
  67.       break;
  68.  
  69.     case 2: /*Insercion al final*/
  70.        introducirDatos(nombre, ape1, ape2, edad);    
  71.          
  72.       /*comprobamos si existe la persona*/
  73.       existe = buscarPersona(cabeza, ape1);
  74.      
  75.       if(!existe) //si no existe
  76.       {
  77.        do{
  78.        insertarFinal(&cabeza, nombre, ape1, ape2, edad);
  79.        printf("\n Persona insertada");
  80.                    printf("\n\n¿Desea introducir otra persona? (S/N): ");
  81.                          scanf("%c", &resp);
  82.                         system("clear");
  83.               }while(resp == 's' || resp =='S');
  84.      mostrarLista(cabeza);
  85.        }
  86.        else
  87.          printf("\n Esta persona ya existe");
  88.        visualizarNodo(existe);
  89.          getchar();
  90.          getchar();
  91.    
  92.        break;
  93.  
  94.      case 3: /*Insertar por apellido1*/
  95.         introducirDatos(nombre, ape1, ape2, edad);  
  96.         /*comprobamos si existe la persona*/
  97.               existe = buscarPersona(cabeza, ape1);
  98.      
  99.       if(!existe)
  100.       {
  101.             do
  102.            {
  103.             insertarPorApellido1(&cabeza, nombre, ape1, ape2, edad);            printf("\n\n¿Desea introducir otra persona? (S/N): ");
  104.             scanf("%c", &resp);
  105.             getchar();
  106.            }while(resp == 's' || resp =='S');
  107.        mostrarLista(cabeza);
  108.        getchar();
  109.        getchar();
  110.     }
  111.          
  112.     else
  113.        printf("\n Esta persona ya existe");
  114.          visualizarNodo(existe);
  115.            getchar();
  116.            getchar();
  117.    
  118.       break;
  119.  
  120.      case 4: /*Borrar por apellido1*/
  121.          printf("\n Introduzca el apellido a borrar: ");
  122.          gets(ape1);
  123.        
  124.      //comprobamos si la persona existe
  125.         existe = buscarPersona(cabeza, ape1);
  126.        if(existe) //si existe
  127.        {
  128.           borrarPorApellido1(&cabeza, ape1);
  129.         printf("\n Elemento borrado");
  130.        getchar();
  131.          mostrarLista(cabeza);
  132.        }    
  133.       else
  134.        printf("\n Elemento no encontrado\n");
  135.  
  136.      getchar();
  137.      getchar();
  138.      break;
  139.      
  140.    case 5:  /* Visualizar por apellido1 */
  141.  
  142.     printf("Introduzca el apellido de la persona a buscar => ");
  143.     gets(ape1);
  144.           existe = buscarPersona(cabeza,ape1);
  145.  
  146.     if (!existe){
  147.       printf("\nEl apellido no existe\n");
  148.     }
  149.     else
  150.     {   visualizarPorApellido1(cabeza,ape1);
  151.       getchar();
  152.     getchar();
  153.     }
  154.     break;
  155.  
  156.     case 6: visualizarCabezaCola(cabeza);
  157.    
  158.            getchar();
  159.       break;
  160.     case 7: visualizarColaCabeza(cabeza);
  161.            getchar();
  162.      
  163.   case 10: printf("Introduzca el nombre del fichero: ");
  164.          scanf("%s", fichero);
  165.          fflush(stdin);
  166.       grabarLista(cabeza, fichero);
  167.      break;
  168.      
  169.      } //cierre del switch
  170.  
  171.  
  172.    }while (opcion);  /* opcion != 0 */
  173.  }
  174.  
  175. /************************ Función crear() ***************************/
  176. /*
  177.    Propósito..: Crea la lista.
  178.    Parámetros.: Puntero cabeza de lista por referencia.
  179.    Devuelve...: Nada.
  180. */
  181. /********************************************************************/
  182.  
  183. void crearLista(struct lista **cabeza)
  184. {
  185.       *cabeza = NULL;
  186.    
  187. }
  188.  
  189. void cogerDatosTexto(struct lista **cabeza)
  190. {
  191.  
  192.     FILE *p; //declaro un puntero al fichero
  193.     struct lista *actual;
  194.     struct lista *aux;
  195.   char nombre[15];
  196.   char ape1[20];
  197.   char ape2[20];
  198.   int edad = 0;
  199.  
  200.  if((p=fopen("listas.txt","r")) == NULL) // abro para lectura
  201.  {
  202.    printf("\n Error al abrir el archivo\n");
  203.    exit (1);
  204.  }
  205.  
  206.   *cabeza=NULL;
  207.  
  208.     while(fscanf(p,"%s %s %s %d",nombre,ape1,ape2,&edad)!=EOF)
  209.     {
  210.     //reservamos espacio para el nuevo elemento
  211.     actual = nuevoElemento();
  212.  
  213.      strcpy(actual->nombre,nombre);
  214.     strcpy(actual->ape1,ape1);
  215.     strcpy(actual->ape2,ape2);
  216.     actual->edad=edad;
  217.     actual->sig = NULL;
  218.     if(*cabeza ==NULL)
  219.       *cabeza = actual;
  220.     else
  221.       aux->sig = actual;
  222.  
  223.     fflush(stdin);
  224.     aux = actual;
  225.   }
  226.    fclose(p);
  227.  
  228. }
  229.  
  230.  
  231.  void presentaMenu(void)
  232. {
  233.    printf("EJEMPLO DE LISTA ENLAZADA\n");
  234.    printf("-------------------------\n\n");
  235.      printf("1.- Insertar al Principio\n");
  236.      printf("2.- Insertar al Final\n");
  237.      printf("3.- Insertar por apellido1\n");
  238.      printf("4.- Borrar por apellido 1\n");
  239.      printf("5.- Visualizar por apellido1 \n");
  240.      printf("6.- Visualizar cabeza cola\n");
  241.      printf("7.- Visualizar cola cabeza\n");
  242.      printf("8.- Liberar Memoria\n");
  243.      printf("9.- Liberar Memoria Recursivo\n");
  244.      printf("10.- Grabar Lista\n");
  245.      printf("0.- TERMINAR.\n\n\n");
  246. }
  247.    
  248.  /******************************Funcion nuevoElemento****************/
  249. /*Funcion que sirve para reservar espacio para un nuevo elemento*/
  250.  
  251. struct lista* nuevoElemento()
  252. {
  253.     struct lista *a;
  254.     a = (struct lista*)malloc(sizeof(struct lista));
  255.     return a;
  256. }
  257.  
  258.  
  259. /************************ Función vacia() ***************************/
  260. /*
  261.    Propósito:  Comprueba si la lista está vacía.
  262.    Parámetros: Puntero cabeza de lista por valor.
  263.    Devuelve:   1 si la lista está vacía.
  264.                0 si no lo está.
  265. */
  266. /********************************************************************/
  267. int listaVacia(struct lista *cabeza)
  268. {
  269.    if (cabeza==NULL)
  270.       return SI;    /* verdad */
  271.    else
  272.       return NO;    /* falso */
  273. }
  274.  
  275. /*Funcion que sirve para insertar los datos al principio de la lista*/
  276.  
  277. void insertarPrincipio(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad)
  278. {
  279.     struct lista *nuevo;
  280.   /*reservamos espacio para el nuevo elemento*/
  281.     nuevo = nuevoElemento();
  282.    
  283.   strcpy(nuevo->nombre, nombre);
  284.     strcpy(nuevo->ape1, ape1);
  285.     strcpy(nuevo->ape2, ape2);
  286.     nuevo->edad = edad;
  287.    
  288.     nuevo->sig = *cabeza;
  289.     *cabeza = nuevo;
  290. }
  291.  
  292. //FUNCION BUSCAR PERSONA
  293.  
  294.   struct lista* buscarPersona(struct lista *cabeza, char *ape1)
  295.   {
  296.        
  297.     struct lista *existe;
  298.   existe = cabeza;
  299.  
  300.     if (listaVacia(cabeza) == SI)
  301.     {
  302.       printf("\n La lista esta vacia.\n");
  303.      
  304.     }
  305.  
  306.     //se recorre la lista hasta encontar el elemento o hasta llegar al final
  307.     while(existe!=NULL)
  308.     {
  309.         if(strcmp(existe->ape1, ape1)== 0)
  310.     {  
  311.       return existe;
  312.    
  313.         }  
  314.         else{
  315.            existe= existe->sig;
  316.     }
  317.   }
  318.   return (NULL);
  319.  
  320. }        
  321.  
  322. //Funcion que sirve para insertar los datos al final de la lista
  323.  
  324. void insertarFinal(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad)
  325. {
  326.     struct lista *nuevo = NULL;
  327.     struct lista *aux = NULL;
  328.    
  329.     //se reserva espacio para el nuevo elemento
  330.     nuevo = nuevoElemento();
  331.   strcpy(nuevo->nombre, nombre);
  332.     strcpy(nuevo->ape1, ape1);
  333.     strcpy(nuevo->ape2, ape2);
  334.     nuevo->edad = edad;
  335.     nuevo->sig = NULL;
  336.    
  337.     if(listaVacia(*cabeza) == SI) //la lista esta vacia, el nuevo sera la cabeza
  338.         *cabeza = nuevo;
  339.     else //se localiza el ultimo elemento para enlazarlo al nuevo
  340.     {
  341.         aux = *cabeza;
  342.         while(aux->sig != NULL)
  343.         {
  344.             aux = aux->sig;
  345.         }
  346.         aux->sig = nuevo; //cuando recorra la lista aux->sig apunta a nuevo
  347.    
  348.     }
  349. }
  350.        
  351.  
  352. void introducirDatos(char *nombre, char *ape1, char *ape2, int edad)
  353. {
  354.           printf("\n Introduzca el nombre => ");
  355.       gets(nombre);
  356.       fflush(stdin);
  357.    
  358.           printf("\nIntroduzca el apellido1 => ");
  359.           gets(ape1);
  360.           fflush(stdin);
  361.        
  362.    
  363.           printf("\nIntroduzca el apellido2 => ");
  364.           gets(ape2);
  365.           fflush(stdin);
  366.        
  367.    
  368.           printf("\nIntroduzca la edad => ");
  369.           scanf("%d",&edad);
  370.           fflush(stdin);
  371.        
  372. }
  373.  
  374. void mostrarLista(struct lista *cabeza)
  375. {
  376.   struct lista *actual;
  377.   actual = cabeza;
  378.  
  379.   while(actual!=NULL)
  380.   {
  381.   printf("%s %s %s %d \n",actual->nombre,actual->ape1,actual->ape2,actual->edad);
  382.   actual = actual->sig;
  383.   }
  384.   printf("\n");
  385.  
  386. }
  387.  
  388. void visualizarNodo(struct lista *nodo)
  389. {
  390.          printf("\n Nombre.....: %s"
  391.                 "\n Apellido1......: %s"
  392.                 "\n Apellido2.....: %s"
  393.                 "\n Edad.....: %d \n",nodo->nombre,nodo->ape1,nodo->ape2,nodo->edad);
  394. }
  395.  
  396. //Esta funcion sirve para insertar por orden alfabetico el primer apellido
  397.  
  398. void insertarPorApellido1(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad)
  399. {
  400.    struct lista *aux=NULL; //almacena elemento posterior al que se inserta
  401.    struct lista *ant =NULL; //almacena elemento anterior al que se inserta
  402.    struct lista *nuevo = NULL; //almacena el nuevo elemento
  403.    int encontrado  = 0;
  404.    
  405.    //Se reserva espacio para el nuevo elemento
  406.   nuevo = nuevoElemento();
  407.   strcpy(nuevo->nombre, nombre);
  408.   strcpy(nuevo->ape1, ape1);
  409.   strcpy(nuevo->ape2, ape2);
  410.   nuevo->edad = edad;
  411.  
  412.    if(listaVacia(*cabeza) == SI) //comprueba si la lista esta vacia
  413.    {
  414.  
  415.   *cabeza = nuevo; //la cabeza será el nuevo elemento
  416.   nuevo->sig = NULL;
  417.    }
  418.  
  419.    else{
  420.      aux = *cabeza;
  421.      if(strcmp(aux->ape1, ape1)>0 ) //nuevo elemento se inserta delante de
  422.                                         //la cabeza
  423.        {
  424.         nuevo->sig=*cabeza; //El siguiente de nuevo será la cabeza
  425.        *cabeza=nuevo;
  426.        }
  427.      else //buscamos la posicion de insercion, se interrumpe cuando se
  428.      //encuentra el primer elemento mayor que n o cuando se llega al final de la lista
  429.          {
  430.  
  431.               while(aux!=NULL && encontrado == 0) {
  432.                    if( strcmp( aux->ape1, ape1 ) >=0 ) //hemos encontrado la posicion de insercion
  433.                     {
  434.                       encontrado = 1;
  435.                      break;
  436.                    
  437.                      }
  438.                    else //se actualizan los valores de ayx y ant
  439.                        {
  440.                        ant=aux;
  441.                        aux=aux->sig;
  442.                        }
  443.  
  444.              }
  445.         if(aux == NULL){  //el elemento se inserta al final
  446.                 ant->sig = nuevo;    
  447.         nuevo->sig = aux;
  448.         }
  449.    }
  450.    }
  451.  
  452. }
  453.  
  454. void borrarPorApellido1(struct lista **cabeza, char *ape1)
  455. {
  456.  struct lista *ant = NULL; //almacena el elemento anterior al que se borra
  457.  struct lista *borrar;  //almacena el elemento a borrar
  458.  
  459. if (listaVacia(*cabeza) == SI)
  460. {
  461.       printf("\n La lista esta vacia.\n");
  462.     exit (0);
  463. }
  464.  
  465. else if (strcmp(ape1, (*cabeza)->ape1) == 0 ) //el elemento a borrar es cabeza
  466.         {
  467.        borrar = *cabeza;
  468.          *cabeza = (*cabeza)->sig;
  469.          free(borrar); //se libera la antigua cabeza
  470.         }
  471. else {
  472.   ant = *cabeza;
  473.   borrar = (*cabeza) -> sig;
  474. }
  475.  
  476. while(borrar != NULL)
  477.      {
  478.     if(!strcmp(ape1, borrar->ape1)) break;
  479.            
  480.       else{ //si son distintos
  481.              ant = borrar;
  482.              borrar = borrar->sig;
  483.             }
  484.      }
  485.  
  486.  
  487.  //el elemento a borrar no es la cabeza
  488.      if (borrar != NULL)    //Si borrar es distinto de NULL
  489.       {
  490.      //si el elemento a borrar no es la cabeza  
  491.      
  492.             ant->sig = borrar->sig;;
  493.            free(borrar);
  494.    }
  495.    
  496.   printf("\n\n El apellido ha sido borrado\n");
  497.   fflush(stdin);
  498.   getchar();
  499. }
  500.  
  501. //Visualizar por Apellido1
  502.  
  503.   void visualizarPorApellido1(struct lista *cabeza,char *ape1)
  504.   {
  505.    
  506.     struct lista *aux = NULL;
  507.     aux = cabeza;
  508.     while( aux!= NULL )
  509.        {
  510.        if( strcmp(aux->ape1, ape1)==0 )
  511.            {
  512.            visualizarNodo(aux);
  513.        aux = aux->sig;
  514.            }
  515.       else {
  516.            aux=aux->sig;
  517.        }
  518.    
  519.   }
  520.    
  521. }
  522.  
  523.  
  524. void visualizarCabezaCola(struct lista *cabeza)
  525. {
  526.   if (listaVacia(cabeza) == SI)
  527.  {
  528.    printf("\n La lista esta vacia\n");
  529.    
  530.    }
  531.    else{
  532.     printf("\n Nombre.........: %s", cabeza->nombre);
  533.     printf("\n Apellido1......: %s", cabeza->ape1);
  534.     printf("\n Apellido2......: %s", cabeza->ape2);
  535.     printf("\n Edad...........: %d\n", cabeza->edad);
  536.          
  537.     //visualizaCabezaCola(cabeza->sig);
  538.   getchar();
  539.   fflush(stdin);
  540.  
  541.     }
  542. }
  543.  
  544. void visualizarColaCabeza(struct lista *cabeza)
  545. {
  546.   if (listaVacia(cabeza) == SI)
  547.  {
  548.    printf("\n La lista esta vacia\n");
  549.    
  550.    }
  551.    else{
  552.     visualizarColaCabeza(cabeza->sig);
  553.   printf("\n Nombre.........: %s", cabeza-> nombre);
  554.     printf("\n Apellido1......: %s", cabeza->ape1);
  555.     printf("\n Apellido2......: %s" ,cabeza->ape2);
  556.     printf("\n Edad...........: %d\n", cabeza->edad);
  557.     getchar();
  558.   fflush(stdin);
  559.  
  560.    
  561.     }
  562.    }
  563.  
  564. //grabar lista
  565.  
  566. void grabarLista(struct lista *cabeza, char *fichero)
  567. {
  568.   FILE *f;
  569.   struct lista *actual = cabeza;
  570.  
  571.  
  572.   if (listaVacia(cabeza) ==SI)
  573.   {
  574.    printf("\n La lista esta vacia\n");
  575.    
  576.   }
  577.  
  578.   f=fopen(fichero, "wb");
  579.  
  580.     while(actual!=NULL){
  581.      
  582.           fwrite(actual, sizeof(struct lista), 1, f);
  583.          actual = actual->sig;
  584.      }
  585.    fclose(f);
  586.  
  587.    
  588.  }
  589.  
  590. /*listas.h*/
  591. /*Declaracion de estructuras y funciones*/
  592.  
  593. #include <stdio.h>
  594. #include <stdlib.h>
  595. #include <string.h>
  596. #include <malloc.h>
  597. #define SI 1
  598. #define NO 0
  599.  
  600. struct lista
  601. {
  602.     char nombre[15];
  603.     char ape1[20];
  604.     char ape2[20];
  605.     int edad;
  606.     struct lista *sig;
  607. };
  608. struct lista *nuevo;
  609.  
  610. void cogerDatosTexto(struct lista **cabeza);
  611.  
  612. void introducirDatos(char *nombre, char *ape1, char *ape2, int edad);
  613.  
  614. struct lista* nuevoElemento();
  615. void presentaMenu(void);
  616. void crearLista(struct lista **cabeza);
  617. int listaVacia(struct lista *cabeza);
  618. void insertarPrincipio(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad);
  619. void visualizarNodo(struct lista *nodo);
  620.  
  621. void mostrarLista(struct lista *cabeza);
  622. void insertarFinal(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad);
  623. void insertarPorApellido1(struct lista **cabeza, char *nombre, char *ape1, char *ape2, int edad);
  624.  
  625. void visualizarPorApellido1(struct lista *cabeza,char *ape1);
  626. struct lista* buscarPersona(struct lista *cabeza, char *ape1);
  627. void visualizarCabezaCola(struct lista *cabeza);
  628. void visualizarColaCabeza(struct lista *cabeza);
  629. void liberarMemoria(struct lista **cabeza);
  630. void liberarMemoriaRecursivo(struct lista **cabeza);
  631. void grabarLista(struct lista *cabeza, char *fichero);
  632. void borrarPorApellido1(struct lista **cabeza, char *ape1);
  633.  
  634.  
  635.  


Yo de momento, lo que veo q aunque funcionen bien las de insertarPrincipio, y insertarFinal, la lista sale, pero luego da error de ejecución de memoria.
Luego en inserttarApellido1, no sé si es que tengo que hcer alguna funcion de ordenar lista, porque si no, no tiene sentido, y la de borrar Apellido1, no me sale bien la ejecucion, lo pide, pero no lo borra, da errores luego al mostrar la lista.
Gracias.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Error De Ejecución En Memoria
« Respuesta #6 en: Sábado 11 de Diciembre de 2004, 16:09 »
0
ok, ya lo estoy revisando.... :comp:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Error De Ejecución En Memoria
« Respuesta #7 en: Sábado 11 de Diciembre de 2004, 17:28 »
0
Cita de: "JuanK"
por favor anexa el codigo completo y cuantame que has logrado revisar del problema y donde crees que sta el error.
hola Juank, ya he anezado el codigo, si no entiendes algo, dimelo, por favor, pero respondeme, q es urgente para mi, gracias.
Saludos Mercedes

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Error De Ejecución En Memoria
« Respuesta #8 en: Sábado 11 de Diciembre de 2004, 18:59 »
0
Cita de: "JuanK"
ok, ya lo estoy revisando.... :comp:
Gracias espero tu respuesta, un saludo.
 :hola:

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Error De Ejecución En Memoria
« Respuesta #9 en: Sábado 11 de Diciembre de 2004, 21:17 »
0
hOLA.

he revisado un poco
Y paso a paso en orden de ejecucion  y de opciones
y tienes varios inconvenientes asi que solo te dire hasta donde encontre los primeros fallos graves, corrigelos, busca mas errores y si tienes dudas pregunta de nuevo, pero eso si te pido el  favor de que antes de preguntar le hagas seguimiento a tu programa ejecutandolo paso a paso ya que las cosas que encontre las encontre haciendolo asi y eso lo hubieses podido hacer tu misma.

El fflush(stdin) no siempre funciona como quisieramos asi que cada vez que quieras capturar algun dato trata de hacer algo como esto, pero no el fflush(stdin)
Código: Text
  1.  
  2. gets(NULL);
  3. scanf(...);
  4.  
  5.  

Ahora si te fijas en este pedacito de codigo:
Código: Text
  1. case 1: /*Insercion al principio*/
  2.     introducirDatos(nombre, ape1, ape2, edad);
  3.     /*comprobamos si existe la persona*/
  4.     existe = buscarPersona(cabeza, ape1);
  5.  
  6.     if(!existe) //existe == NULL
  7.     {
  8.         do
  9.         {
  10.             insertarPrincipio(&cabeza, nombre,ape1, ape2,edad);
  11.             printf("\n Persona insertada");
  12.             printf("\n\n┐Desea introducir otra persona? (S/N): ");
  13.             gets(NULL);//JUANK
  14.             scanf("%c", &resp);
  15.  
  16.         }while(resp == 's' || resp =='S');
  17.  
  18.         mostrarLista(cabeza);
  19.         getchar();
  20.     }
  21.  

Preguntas que si se desea insertar mas personas ....
pero si seleccionas que si volvera a realizar la funcion insertarPrincipio(...)
sin antes haber realizado la funcion introducirDatos(...) lo cual hara que vuelva a insertar el mismo nodo.

Espero te sea de ayuda y si tienes más dudas solo pregunta. :comp:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Error De Ejecución En Memoria
« Respuesta #10 en: Sábado 11 de Diciembre de 2004, 21:31 »
0
Cita de: "JuanK"
hOLA.

he revisado un poco
Y paso a paso en orden de ejecucion  y de opciones
y tienes varios inconvenientes asi que solo te dire hasta donde encontre los primeros fallos graves, corrigelos, busca mas errores y si tienes dudas pregunta de nuevo, pero eso si te pido el  favor de que antes de preguntar le hagas seguimiento a tu programa ejecutandolo paso a paso ya que las cosas que encontre las encontre haciendolo asi y eso lo hubieses podido hacer tu misma.

El fflush(stdin) no siempre funciona como quisieramos asi que cada vez que quieras capturar algun dato trata de hacer algo como esto, pero no el fflush(stdin)
Código: Text
  1.  
  2. gets(NULL);
  3. scanf(...);
  4.  
  5.  

Ahora si te fijas en este pedacito de codigo:
Código: Text
  1. case 1: /*Insercion al principio*/
  2.     introducirDatos(nombre, ape1, ape2, edad);
  3.     /*comprobamos si existe la persona*/
  4.     existe = buscarPersona(cabeza, ape1);
  5.  
  6.     if(!existe) //existe == NULL
  7.     {
  8.         do
  9.         {
  10.             insertarPrincipio(&cabeza, nombre,ape1, ape2,edad);
  11.             printf("\n Persona insertada");
  12.             printf("\n\n┐Desea introducir otra persona? (S/N): ");
  13.             gets(NULL);//JUANK
  14.             scanf("%c", &resp);
  15.  
  16.         }while(resp == 's' || resp =='S');
  17.  
  18.         mostrarLista(cabeza);
  19.         getchar();
  20.     }
  21.  

Preguntas que si se desea insertar mas personas ....
pero si seleccionas que si volvera a realizar la funcion insertarPrincipio(...)
sin antes haber realizado la funcion introducirDatos(...) lo cual hara que vuelva a insertar el mismo nodo.

Espero te sea de ayuda y si tienes más dudas solo pregunta. :comp:
Gracias verás ya he modificado la funcion
void introducirDatos(struct lista *dat)

{
          printf("\nIntroduzca el nombre => ");
        gets(dat->nombre);
        fflush(stdin);
   
          printf("\nIntroduzca el apellido1 => ");
          gets(dat->ape1);
          fflush(stdin);
       
   
          printf("\nIntroduzca el apellido2 => ");
          gets(dat->ape2);
          fflush(stdin);
       
   
          printf("\nIntroduzca la edad => ");
          scanf("%d",&dat->edad);
          fflush(stdin);
        dat->sig = NULL;
}
y me salen mejor, ya si me coge la edad. Mi problema ahora, es que inserta por apellido, ordenador, pero tengo echa una funcion para ordenar lista, y no se donde ponerla, ademas que no se proque siempre da error de ejecucion de memoria.

Te pongo aqui las dos funciones insertarporApellido1, y la nueva de ordenarLista.
void insertarPorApellido1(struct lista **cabeza,char *nombre, char *ape1, char *ape2, int edad)
{
   struct lista *aux=NULL; //almacena elemento posterior al que se inserta
   struct lista *ant =NULL; //almacena elemento anterior al que se inserta
   struct lista *nuevo = NULL; //almacena el nuevo elemento
   int encontrado  = 0;
   
   
   
   //Se reserva espacio para el nuevo elemento
   nuevo = nuevoElemento();
   introducirDatos(nuevo);
   
   if(listaVacia(*cabeza) == SI) //comprueba si la lista esta vacia
   {
   
   *cabeza = nuevo; //la cabeza será el nuevo elemento
   nuevo->sig = NULL;
   }

   else{
      aux = *cabeza;
      if(strcmp(ape1, aux->ape1)<0 ) //nuevo elemento se inserta delante de
                                      //la cabeza
      {
        nuevo->sig=*cabeza; //El siguiente de nuevo será la cabeza
       *cabeza=nuevo;
       }
      else {
         ant = *cabeza;
           aux=(*cabeza)->sig;//buscamos la posicion de insercion, se interrumpe cuando se
     //encuentra el primer elemento mayor que n o cuando se llega al final de la lista
         {
 
              while(aux!=NULL && encontrado == 0) {
                   if( strcmp( ape1, aux->ape1 ) <0 ) //hemos encontrado la posicion de insercion
                    {
                   ant->sig=nuevo;
                        nuevo->sig=aux;
                       encontrado = 1;
                     break;
                   
                     }
                   else //se actualizan los valores de ayx y ant
                       {
                       ant=aux;
                       aux=aux->sig;
                       }

             }
           if(aux == NULL){  //el elemento se inserta al final
                ant->sig = nuevo;     
            nuevo->sig = aux;
           }
       }
       }
   }
}

int listaOrdenadaApellido(struct lista *cabeza)
{
while(cabeza->sig!=NULL)
{

   if (strcmp(cabeza->ape1,cabeza->sig->ape1)>0)
   {   printf ("La lista no está ordenada por apellido1\n");
      exit (1);
   }
   cabeza=cabeza->sig;
}


return 0;
}

Voy a cenar, ahora despues de cenar, vere si mehas contestado, gracias por tu ayuda. Slaudos Mercedes.
 :rolleyes:

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Error De Ejecución En Memoria
« Respuesta #11 en: Sábado 11 de Diciembre de 2004, 22:27 »
0
ok, aunque a mi me funcinaba bien.

No se si ya has arreglado lo que te comente, y por favor adjuntame el codigo comlpeto en un archivo .zip-
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Error De Ejecución En Memoria
« Respuesta #12 en: Sábado 11 de Diciembre de 2004, 22:39 »
0
Cita de: "JuanK"
ok, aunque a mi me funcinaba bien.

No se si ya has arreglado lo que te comente, y por favor adjuntame el codigo comlpeto en un archivo .zip-
Gracias voy a cenar, ahora despues vuelvo.
El mensaje contiene 1 archivo adjunto. Debes ingresar o registrarte para poder verlo y descargarlo.

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Error De Ejecución En Memoria
« Respuesta #13 en: Domingo 12 de Diciembre de 2004, 18:58 »
0
Hola,
lamentablemente he estado muy ocupado,
y aunque he recibido tu correo lo ciertyo es que no he teniodo tiempo de seguirlo revisando.

Tratare de hacer algo más tarde pero es incierto a que hora comenzare a  hacerlo debido a algunas cosas que tengo que hacer.

en este momento aca enm colombia son las 13:00.
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Error De Ejecución En Memoria
« Respuesta #14 en: Domingo 12 de Diciembre de 2004, 19:46 »
0
Cita de: "JuanK"
Hola,
lamentablemente he estado muy ocupado,
y aunque he recibido tu correo lo ciertyo es que no he teniodo tiempo de seguirlo revisando.

Tratare de hacer algo más tarde pero es incierto a que hora comenzare a  hacerlo debido a algunas cosas que tengo que hacer.

en este momento aca enm colombia son las 13:00.
Gracias de todos modos, entiendo no sabia qu eres colombiano. Aqui son las 8 de la tarde, cuando puedas las miras, luego veo si me has contestado. Gracias
Y perdon por las molestias.
Saludos desde ESpaña