• Miércoles 6 de Noviembre de 2024, 04:43

Autor Tema:  Estructuras De Datos Dinamicas En C  (Leído 2483 veces)

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Estructuras De Datos Dinamicas En C
« en: Martes 14 de Diciembre de 2004, 12:59 »
0
Hola a todos, estoy haciendo una practica de colas en C, otra de pilas, y ambas me dan error de ejecucion de memoria, si alguien tiene tiempo, y puede ayudarme, es que no se donde esta el fallo,es muy importante.Adjunto aqui el codigo de cada una de ellas.Ruego me contesten lo antes posible, gracias.
[CODE]
/*colas.h*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

struct cola{
   char fichero[31];
   int tamanyo;
   char usuario[31];
   int ident;
   struct cola *sig;
};
void crear(struct cola **frente);
int vaciaCola(struct cola *frente);
void introducirDatos(struct cola *datos);
void anyadir(struct cola **final);
struct cola *nuevoElemento();
void eliminar(struct cola **frente);
void visualizar(struct cola *actual);
void imprimirTrabajo(struct cola **frente);
void listar(struct cola **frente);
int presentaMenu(void);

/*colas.c*/
#include "colas.h"

main()
{
   int opcion;
   struct cola *frente, *final;

   do{

      crear(&frente);
      do{
         opcion = presentaMenu();

       }while(opcion <0 || opcion > 4);
     
      switch(opcion)
      {
   
         case 1: /*Añadir un trabajo*/
                anyadir(&final);
            break;
         case 2: //Imprimir un trabajo
            imprimirTrabajo(&frente);
            break;
         case 3: //listar trabajos
            listar(&frente);
            break;
         case 4: //eliminar un trabajo
            eliminar(&frente);
            break;
         case 0:
            printf("\n\n\nADIOS\n");
            break;
      }
   }while(opcion);
}


      
void crear(struct cola **frente)
{
   *frente = NULL;
}

int vaciaCola(struct cola *frente)
{
   if(frente == NULL)
      return 1;
   else
      return 0;
}

void introducirDatos(struct cola *datos)
{
   
   printf("\nIntroduzca el nombre del fichero: ");
   gets(datos->fichero);
   fflush(stdin);

   printf("\n Introduzca el tamanyo: ");
   scanf("%d", &datos->tamanyo);
   fflush(stdin);

   printf("\nIntroduzca el nombre de usuario: ");
   gets(datos->usuario);
   fflush(stdin);

   printf("\nIntroduzca el identificador: ");
   scanf("%d", &datos->ident);
   getche();
   
}

int presentaMenu(void)
{
   int opcion;
    printf("EJEMPLO DE MANEJO DE COLAS\n");
    printf("-------------------------\n\n");
     printf("1.- Anyadir un trabajo a la cola\n");
     printf("2.- Imprimir un trabajo\n");
     printf("3.- Listar los trabajos\n");
     printf("4.- Eliminar un trabajo\n");
     printf("0.- TERMINAR.\n\n\n");
     printf("Introduce una opcion: ");
     scanf("%d",&opcion);
     fflush(stdin);
    return opcion;
}

struct cola *nuevoElemento()
{
   struct cola *a;
   a = (struct cola *) malloc(sizeof(struct cola));
   return a;
}

void anyadir(struct cola **final)
{
 struct cola *nuevo= NULL;
 struct cola *aux = NULL; //almacena el posterior al que se inserta

 
   printf("AÑADIR TRABAJOS\n");
   printf("**********************\n\n");
 
  nuevo = nuevoElemento();
 introducirDatos(nuevo);


 if(vaciaCola(*final))
 {
    nuevo->sig = *final;
    *final = nuevo;

 }
 else
 {
    aux = *final;
    while((aux->sig) !=NULL){
       aux = aux->sig;
    }
    if(nuevo !=NULL)
    {
       aux->sig = nuevo;
       nuevo->sig =NULL;
    }
 }
}


void eliminar(struct cola **frente)
{
   struct cola *borrar, *ant = NULL;
   int id;

   system("clear");
   printf("ELIMINAR TRABAJOS\n");
   printf("**********************\n\n");
   printf("\n Introduzca el identificador de trabajo: ");
   scanf("%d", &id);


   if(vaciaCola(*frente))
   {
      printf("\nLa cola esta vacia\n");
      exit(0);
   }
   else
   {
      while(borrar!=NULL && borrar->ident == id)
         {
         if(ant == NULL){
            borrar = *frente;
            *frente = (*frente)->sig;
            free(borrar);
            }
            else{
               ant->sig = borrar->sig;
               free(borrar);
               }
         }
            //si son distintos
         ant = borrar;
         borrar = borrar->sig;

   }
}


void visualizar(struct cola *actual)
{
    printf("\n Fichero..................: %s", actual->fichero);
     printf("\n Tamanyo en bytes.........: %d", actual->tamanyo);
     printf("\n Nombre de usuario........: %s", actual->usuario);
     printf("\n Identificador............: %d", actual->ident);
   actual = actual->sig;

   
}

void listar(struct cola **frente)
{
   struct cola *actual;
   system("clear");
   printf("LISTAR TRABAJOS DE LA COLA\n");
   printf("**********************\n\n");
   
   actual = *frente;
   if(!vaciaCola(*frente))
   {
      while(actual!=NULL)
      {
         visualizar(actual);
         printf("\n");
         fflush(stdin);
         printf("\nPulse intro para continuar....");
         getchar();

         actual = actual->sig;
      }
   }
}

void imprimirTrabajo(struct cola **frente)
{
   struct cola *borrar;
   system("clear");
   printf("IMPRIMIR TRABAJOS\n");
   printf("**********************\n\n");
   
   borrar = *frente;
   visualizar(borrar);
      fflush(stdin);
      printf("\nPulse intro para continuar....");
      getchar();
    *frente = (*frente)->sig;
   free(borrar);
}

/*pilas.h*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ASCENDENTE 1
#define DESCENDENTE 0

struct pila{
   char nombre[15];
   int edad;
   struct pila *sig;
};

void crearPila(struct pila **cima);
int pilaVacia(struct pila *cima);
void apilar(struct pila **cima);
void desapilar(struct pila **cima);
void listarPila(struct pila *cima);
//void eliminarPila(struct pila **cima, char *nombre);
void liberar(struct pila **cima);
int menu(void);

struct pila *nuevoElemento();
void visualizar(struct pila *cima);
void leerDatos(struct pila *dat);
void verCima(struct pila *cima);
void top(struct pila *cima,char *nom, int *ed);

/*pilas.c*/
#include "pilas.h"

main(void)
{
   struct pila *cima;
   int opcion;
   do{
   crearPila(&cima);

   do
   {
      opcion = menu();
      
   }while(opcion <0 || opcion >5);

      switch(opcion)
      {
      case 1: //añadir en la pila
         apilar(&cima);

         break;
      case 2: //ver la cima de la pila
         verCima(cima);
         break;
      case 3: //Desapilar un elemento de la cima
         desapilar(&cima);
         break;
      case 4: //Listar la pila
         listarPila(cima);
         break;
   
      case 5: //Liberar la memoria de la pila
         liberar(&cima);

         break;
      }
   }while(opcion);
}

int menu(void)
{
   int opcion;

   printf("******** EJEMPLO DE PILAS **********\n");
   printf("1. Añadir en la pila\n");
   printf("2. Cima de la pila\n");
   printf("3. Desapilar un elemento de la pila\n");
   printf("4. Listar la pila\n");
   printf("5. Liberar la memoria ocupada por la pila\n\n");
   printf("0. TERMINAR\n\n");
   printf("\nIntroduce una opcion: ");
   scanf("%d",&opcion);
   fflush(stdin);

   return opcion;
}
/************************** Funcion crearPila() *********************/
/* Propósito.........: Crea la pila.
   Parametro.........: Puntero cima d ela pila por referencia
   Devuelve..........: Nada
   */
/********************************************************************/

void crearPila(struct pila **cima)
{
   *cima = NULL;
}

/************************** Funcion pilaVacia() *********************/
/* Propósito.........: Comprueba si la pila está vacia
   Parametro.........: Puntero cima de la pila por valor
   Devuelve..........:  SI si la pila está vacia
                  NO si la pila no lo está.
   */
/********************************************************************/


int pilaVacia(struct pila *cima)
{
   if(cima == NULL)
      return 1;
   else
      return 0;
}


void leerDatos(struct pila *dat)
{
   printf("\nIntroduzca el nombre...: ");
   gets(dat->nombre);
   fflush(stdin);

   printf("\nIntroduzca la edad...: ");
    scanf("%d", &dat->edad);
   fflush(stdin);

    dat->sig = NULL;
}

struct pila *nuevoElemento()
{
   struct pila *a;
   a = (struct pila *) malloc(sizeof(struct pila));
   return a;
}

/************************** Funcion apilar() *********************/
/* Propósito.........: Añade elementos a la pila
   Parametro.........: Puntero cima de la pila por referencia
   Devuelve..........:  Nada
   */
/********************************************************************/

void apilar(struct pila **cima)
{
   struct pila *nuevo;
   nuevo = nuevoElemento();
   leerDatos(nuevo);

   nuevo->sig = *cima;
   *cima = nuevo;
}
/************************** Funcion desapilar() *********************/
/* Propósito.........: Elimina elementos de la cima de la pila
   Parametro.........: Puntero cima de la pila por referencia
   Devuelve..........:  nada
   */
/********************************************************************/

void desapilar(struct pila **cima)
{
   struct pila *borrar;
    if (pilaVacia(*cima))
      printf("\n La pila está vacia\n");
   else
   {

   borrar = *cima;
   *cima = borrar->sig;
   free(borrar);
   }
   
}
/************************** Funcion eliminarPila() *********************/
/* Propósito.........: Se encarga de eliminar un elemento por su nombre
   Parametro.........: Puntero cima de la pila por valor, y el nombre
                  del alumno que queremos que se borre.
   Devuelve..........:  Nada.
   Llamadas... a la funcion crearPila, apilar, y desapilar  
*/
/********************************************************************/


/************************** Funcion desapilar() *********************/
/* Propósito.........: Muestra por pantalla los elemento s de la pila
                  desde la cima hasta la base
   Parametro.........: Puntero cima de la pila por valor
   Devuelve..........:  nada
   */
/********************************************************************/
void visualizar(struct pila *cima)
{
   struct pila *actual;
   actual = cima;
   while(actual!=NULL)
   {
      printf("Nombre.........%s\n ", actual->nombre);
      printf("Edad...........%d\n ", actual->edad);
      actual = actual->sig;
   }
}

/************************** Funcion listarPila() *********************/
/* Propósito.........: Muestra por pantalla los elementos de la pila.
   Parametro.........: Puntero cima de la pila por valor.
   Devuelve..........:  Nada.
   Llamada ... a la funcion visualizar()
   */
/********************************************************************/
void listarPila(struct pila *cima)
{
   if(pilaVacia(cima))
      printf("\n\nLa pila esta vacia\n");
   else
   {
      printf("\nLISTADO DEL ESTADO DE LA PILA\n");
   visualizar(cima);
   }
   getchar();
}


void liberar(struct pila **cima)
{
   struct pila *actual, *aux;
   actual = *cima;
   while(actual!=NULL)
   {
      aux = actual->sig;
      free(actual);
      actual = aux;
   }
   *cima = NULL;
}

void verCima(struct pila *cima)
{
   char nom[15];
   int ed;

   if (pilaVacia(cima))
      printf("\n\nLa pila está vacía.\n");
   else
   {
      top(cima,nom,ed);

         printf("\n\nValor de la cima: %s\n",nom);
     
         printf("\n\nValor de la cima: %d\n",ed);
   }
}
void top(struct pila *cima,char *nom, int *ed)
{
   /* si la pila está vacía no hacemos nada */
   if (pilaVacia(cima))
      exit (0);

   /* proceso normal (pila no vacía) */
   strcpy(*nom, cima->nombre);
   
   *ed = cima->edad;
 
}

mgitano2001

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: Estructuras De Datos Dinamicas En C
« Respuesta #1 en: Miércoles 15 de Diciembre de 2004, 05:18 »
0
No lei con mucha atencion el codigo, pero note que cuando agregar un elemento en la cola, solamente estas pasando un puntero (el final), si usas cola normar (una estructura tipica, no una cola circular ni nada de eso), tenes que pasar los dos punteros, aca va un ejemplo:

struct cola {
         int dato;
         struct cola *next;
};

int enqueue(struct cola **head, struct cola **tail, int dato)
{
          struct cola *nuevo = (struct cola *) malloc(sizeof(struct cola));

          if (!nuevo)
               return -1; /* No hay memoria suficiente */

          nuevo->dato = dato;
          nuevo->next = NULL;

          if (*head == NULL)
                  *head = nuevo;
          else
                  (*tail)->next = nuevo;

           *tail = nuevo;
           return 0;           /* Todo concluyo bien */
}


(Consejo: Trata de dibujar todo, es mas facil de entender, "Si puedes dibujarlo puedes organizarlo") Saludos!!!,
Mgitano2001
</span></span>

i82maria

  • Miembro MUY activo
  • ***
  • Mensajes: 119
    • Ver Perfil
Re: Estructuras De Datos Dinamicas En C
« Respuesta #2 en: Miércoles 15 de Diciembre de 2004, 11:34 »
0
Cita de: "mgitano2001"
No lei con mucha atencion el codigo, pero note que cuando agregar un elemento en la cola, solamente estas pasando un puntero (el final), si usas cola normar (una estructura tipica, no una cola circular ni nada de eso), tenes que pasar los dos punteros, aca va un ejemplo:

struct cola {
         int dato;
         struct cola *next;
};

int enqueue(struct cola **head, struct cola **tail, int dato)
{
          struct cola *nuevo = (struct cola *) malloc(sizeof(struct cola));

          if (!nuevo)
               return -1; /* No hay memoria suficiente */

          nuevo->dato = dato;
          nuevo->next = NULL;

          if (*head == NULL)
                  *head = nuevo;
          else
                  (*tail)->next = nuevo;

           *tail = nuevo;
           return 0;           /* Todo concluyo bien */
}


(Consejo: Trata de dibujar todo, es mas facil de entender, "Si puedes dibujarlo puedes organizarlo") Saludos!!!,
Mgitano2001
Entonces segun tu me dices tengo que usar ds punteros, el final y la cabeza de la cola, no?. Asi me funcionará bien el programa?. Por favor, respondeme es importante, tengo que tenerlo echo para esta tarde.
Gracias por haberme respondido antes.

mgitano2001

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: Estructuras De Datos Dinamicas En C
« Respuesta #3 en: Miércoles 15 de Diciembre de 2004, 18:57 »
0
Si, te recomiendo que todo lo que hagas lo pruebes, cualquier cosa, a lo largo de la tarde voy a fijarme y tratar de responderte todo lo que pueda. Asi que no te hagas problema, cualquir cosa aca tenes mi msn, estoy conectado todo el dia, saludos y suerte.

mgitano2001@hotmail.com

Bye
</span></span>

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Estructuras De Datos Dinamicas En C
« Respuesta #4 en: Miércoles 15 de Diciembre de 2004, 19:47 »
0
en lo posile traten de colocar los post en el foro ya que asi conribuimos a que la infromacion le sirva a mas personas.  :smartass:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

mgitano2001

  • Nuevo Miembro
  • *
  • Mensajes: 24
    • Ver Perfil
Re: Estructuras De Datos Dinamicas En C
« Respuesta #5 en: Miércoles 15 de Diciembre de 2004, 20:15 »
0
OK
</span></span>