Buenas noches,
Me duele la cabeza de tanto darle vueltas a un programa que estoy haciendo, que pretende implementar el tad cola, en c.
Llevo muy poco con este lenguaje, ya habia hecho una implementación en pascal, pero veo me esto del c es mucho mas jodio.
Lo que tengo es esto:
/cola de enteros dinámica/
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define TRUE 1
#define FALSE 0
#define OK 0
#define ERROR 1
typedef struct elemento{
int valor;
struct elemento sig; /puntero a un tipo elemento*/
}tipo_elemento ;
typedef struct cola{
tipo_elemento *cabeza, *final;
} tipo_cola;
void inicializar_cola(tipo_cola *cola);
int cola_vacia(tipo_cola cola);
int num_elems_cola(tipo_cola cola);
int cabeza(tipo_cola cola);
void encolar (tipo_cola *cola, int elemento);
void desencolar(tipo_cola *cola);
void imprimir(tipo_cola cola);
int main(void)
{
char op;
int elemento;
tipo_cola cola;
inicializar_cola(&cola);
do
{
printf("Implementacion de colas con punteros\n\n");
printf("1. Encolar elemento\n");
printf("2. Desencolar elemento\n");
printf("3. Ver elementos\n");
printf("4. Finalizar programa\n");
if (cola_vacia(cola)) printf("vacia\n");
printf("\nEn este momento la cola tiene %d elementos.\n", num_elems_cola(cola));
op=getch(); /ojo lleva parentesis/
switch (op)
{
case '1':
printf("Escribe el elemento a encolar: ");
scanf("%d", &elemento);
encolar(&cola, elemento);
break;
case '2':
if (!cola_vacia(cola))
{
printf("Desencolando elemento \"%d\" de la primera posicion\n", cabeza(cola));
desencolar(&cola);
}
else
printf("Es imposible desencolar algo si NO HAY ELEMENTOS x(\n");
break;
case '3':
if (!cola_vacia(cola))
{
printf("Los elementos de la cola son:\n");
imprimir(cola);
}
else
printf("Imposible mostrar los elementos porque NO HAY!\n");
break;
}
}
while (op!='4');
return 0;
}
void inicializar_cola(tipo_cola *cola)
{
cola->cabeza=NULL;
cola->final=NULL;
}
int cola_vacia(tipo_cola cola)
{
if (cola.cabeza==NULL && cola.final==NULL)
return TRUE;
else
return FALSE;
}
int num_elems_cola(tipo_cola cola)
{
int n=0;
while (cola.cabeza != NULL)
{
cola.cabeza=cola.cabeza->sig;
n++;
}
return n;
}
int cabeza(tipo_cola cola)
{
return cola.cabeza->valor;
}
void encolar (tipo_cola *cola, int elemento)
{
tipo_elemento aux;
aux=(tipo_elemento)malloc(sizeof(tipo_elemento));
aux->valor=elemento;
aux->sig=NULL;
if (cola_vacia(*cola))
cola->cabeza=aux;
else
cola->final->sig=aux;
cola->final=aux;
}
void desencolar(tipo_cola *cola)
{
tipo_elemento *aux;
aux=cola->cabeza;
cola->cabeza=cola->cabeza->sig;
if (cola->cabeza=NULL)
cola->final=NULL;
free(aux);
}
void imprimir(tipo_cola cola)
{
int linea=1;
while (cola.cabeza!=NULL)
{
printf("%d. %d\n", linea, cola.cabeza->valor);
cola.cabeza=cola.cabeza->sig;
linea++;
}
}
Realmente no se muy bien dónde puede estar el fallo, supongo que en la función encolar o desencolar, pero no estoy seguro.
El problema que da es en tiempo de ejecución, una violación de esas que salen hasta debajo de las piedras . Encolo un elemento y todo perfecto, lo indica y lo muestra correctamente, ahora lo desencolo y todo de puta madre, pero si vuelvo a encolar otra vez ya no se entera, ni lo marca ni nada y entonces, como es como si se hubiera encolado nada, me peta al intentar desencolar.
Si alguien controla el tema o tiene ejemplos, o links o algo que me oriente, muchas gracias...