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;
}