Ayuda con Cola en C (sencillo)

Iniciado por Adry89, 30 Mayo 2010, 21:00 PM

0 Miembros y 2 Visitantes están viendo este tema.

Adry89

Bueno, pues me da 4 o 5 errores azules de incompatibilidad de tipos sobre todo y no sé que falla, el programa es muy sencillo de 200 líneas...a ver si me podéis ayudar, estoy desesperada =(

#include <stdio.h>
#include <stdlib.h>

/*declaracion de la cola*/

typedef struct _DATOS
{
    char nombre[20];
    char apellidos[30];
    char telefono[12];
    char movil[12];
    int edad;

}DATOS;

struct nodo
{

int elemento;

struct nodo *siguiente;

};

typedef struct nodo Nodo;

typedef struct
{

Nodo *frente;

Nodo *final;

}Cola;

/*Prototipos de funciones*/

void crearcola(Cola *cola);
void insertar (Cola *cola, int x);
int borrar (Cola *cola);
int estavacia (Cola cola);

int main(void)
{

/*Declaracion de variables locales*/

Nodo *lista;
int num;
DATOS dat;

/*Algoritmo*/

lista = crearcola ();

   do
   {

   printf("--------------------------------\n\n");
   printf("Bienvenido a la agenda del movil \n\n");
   printf("elige una opcion : \n\n");
   printf("1.-Añadir. \n");
   printf("2.-Borrar.\n");
   printf("4.-Salir.\n");

   printf("Su opcion es: ");
   scanf("%d",&num);

    switch(num)
    {

        case 1 :  printf("Introduce los valores del dato");
                  dat = leer ();
                  lista = insertar (dat, lista);
        break;

        case 2 :  borrar (dat, lista);
        break;

        case 3 : 
        break;

      default : printf("Error: Introduce un numero del menu");

    }

   }while(num!=3);


   return(0);

}



/*definicion de las funciones*/

DATOS leer ( void )
{

    /*Declaracion de variables locales*/

    DATOS d;

    /*Algoritmo*/

   printf("Introduce Nombre: ");
   scanf("\n%s", d.nombre);
   printf("Introduce Apellido: ");
   scanf("\n%s",d.apellidos);
   printf("Introduce Telefono: ");
   scanf("\n%s",d.telefono);
   printf("Introduce Movil: ");
   scanf("\n%s",d.movil);
   printf("Introduce Edad: ");
   scanf("%d",&d.edad);

   return(d);
}

void CrearCola(Cola *cola)

{

cola->frente=cola->final=NULL;

}

/*funcion que inserta el dato en la parte final de la cola*/

void insert (Cola *cola, int x)

{

Nodo *nuevo;

nuevo=(Nodo*)malloc(sizeof(Nodo));

nuevo->elemento=x;

nuevo->siguiente=NULL;

if(empty(*cola))

{

cola->frente=nuevo;

}

else

cola->final->siguiente=nuevo;

cola->final=nuevo;

}

/*elimina el elemento que esta aL frente de la cola*/

int remover (Cola *cola)

{

int temp=NULL;

if(!empty(*cola))

{

Nodo *nuevo;

nuevo=cola->frente;

temp=cola->frente->elemento;

cola->frente=cola->frente->siguiente;

free(nuevo);

}

else

printf("ERROR, cola vacia, se puede eliminar\a\n");

return (temp);

}

int empty(Cola cola)

{

return (cola.frente==NULL);

}

nicolas_cof

Algunos errores a simple vista...

lista = crearcola();
La funcion crearcola() devuelve void, por lo tanto asignarla a una variable es erroneo

default: printf("Error: Introduce un numero del menu");
Te falta poner break;

leer(void)
remover(Cola *cola)
empty(Cola cola)

Te falta definir el prototipo de estas funciones

estavacia (Cola cola);
Mmmm no hay ninguna definicion de esta funcion

void crearcola(Cola *cola); // prototipo
void CrearCola(Cola *cola) {} // definicion

No concuerdan el nombre puesto en el prototipo de la funcion con el nombre en la definicion. Acordate que C es un lenguaje case sensitive.

Salu10.

Adry89

Corregido todo eso los fallos azules siguen apareciendo, no tiene nada que ver con lo que has dicho =(

.:BlackCoder:.

default no lleva break nicolas...

Saludos...
"No te esfuerzes por saber mas, esfuerzate por ser el mejor en lo que sabes... Y asi sabras mas" .:BlackCoder:. jajaja




Littlehorse

Estas llamando funciones sin pasarle parámetros cuando en los prototipos y definiciones especificas los parámetros necesarios para la correcta ejecución de dicha funcion.
Por otro lado, los errores de incompatibilidad radican en utilizar en forma errónea los tipos de datos que declaraste.

Por ejemplo, en esta función que declaraste:


void insertar (Cola *cola, int x);


La llamas así:

insertar (dat, lista);

donde dat y lista son:

DATOS dat;
Nodo *lista;


Todo esto sumado a los errores que ya mencionaron, como por ejemplo asignar el retorno de una función como dato útil cuando en el prototipo esta declarada como void.
Si solucionaste todos los errores mencionados, vuelve a postear el código.

[code=c]código[/code]

Repasa atentamente el manejo de funciones y estructuras.

Saludos!
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

nicolas_cof

Cita de: Adry89Corregido todo eso los fallos azules siguen apareciendo, no tiene nada que ver con lo que has dicho =(

Mmmmm en ningun momento te asegure que corrigiendo esos errores, los "fallos azules" iban a desaparecer :P

Estaria bueno que pongas en el post esos "fallos azules" de los que hablas :¬¬

Salu10.

Adry89

Muchas gracias a todos por las respuestas. He corregido todo y esto es lo que falla:

hdrhdrh.c:69: error: incompatible types in assignment
hdrhdrh.c:89: error: incompatible type for argument 2 of `insertar'
hdrhdrh.c:89: error: incompatible types in assignment
hdrhdrh.c:185: error: incompatible type for argument 1 of `estavacia'
hdrhdrh.c:192: warning: assignment makes pointer from integer without a cast
hdrhdrh.c:204: error: incompatible types in return

Adjunto el código de nuevo:

#include <stdio.h>
#include <stdlib.h>
#define TAM 30
#define TRUE 1
#define FALSE 0

/*declaracion de la cola*/

typedef struct _DATOS
{
    char nombre[20];
    char apellidos[30];
    char telefono[12];
    char movil[12];
    int edad;

}DATOS;

struct nodo
{

int elemento;

struct nodo *siguiente;

};

typedef struct nodo Nodo;

typedef struct
{

Nodo *frente;

Nodo *final;

}Cola;

/*Prototipos de funciones*/

Nodo crearcola(Cola *cola);
Nodo insertar (Cola *cola, int x);
Nodo borrar (Cola *cola);
int estavacia (Cola cola);
DATOS leer ( void );

int main(void)
{

/*Declaracion de variables locales*/

Nodo *lista;
int num;
DATOS dat;
Cola *cola;

/*Algoritmo*/

lista = crearcola (cola);

   do
   {

   printf("--------------------------------\n\n");
   printf("Bienvenido a la agenda del movil \n\n");
   printf("elige una opcion : \n\n");
   printf("1.-Añadir. \n");
   printf("2.-Borrar.\n");
   printf("4.-Salir.\n");

   printf("Su opcion es: ");
   scanf("%d",&num);

    switch(num)
    {

        case 1 :  printf("Introduce los valores del dato");
                  dat = leer ();
                  lista = insertar (cola,dat);
        break;

        case 2 :  borrar (cola);
        break;

        case 3 :
        break;

      default : printf("Error: Introduce un numero del menu");

    }

   }while(num!=3);


   return(0);

}



/*definicion de las funciones*/

DATOS leer ( void )
{

    /*Declaracion de variables locales*/

    DATOS d;

    /*Algoritmo*/

   printf("Introduce Nombre: ");
   scanf("\n%s", d.nombre);
   printf("Introduce Apellido: ");
   scanf("\n%s",d.apellidos);
   printf("Introduce Telefono: ");
   scanf("\n%s",d.telefono);
   printf("Introduce Movil: ");
   scanf("\n%s",d.movil);
   printf("Introduce Edad: ");
   scanf("%d",&d.edad);

   return(d);
}

Nodo crearcola(Cola *cola)

{

cola->frente=cola->final=NULL;

}

/*funcion que inserta el dato en la parte final de la cola*/

Nodo insertar (Cola *cola, int x)

{

Nodo *nuevo;

nuevo=(Nodo*)malloc(sizeof(Nodo));

nuevo->elemento=x;

nuevo->siguiente=NULL;

if(estavacia(*cola))

{

cola->frente=nuevo;

}

else

cola->final->siguiente=nuevo;

cola->final=nuevo;

}

/*elimina el elemento que esta aL frente de la cola*/

Nodo borrar (Cola *cola)

{

Nodo *temp;
Nodo *nuevo;

temp = NULL;

if(!estavacia(cola))

{


nuevo=cola->frente;

temp=cola->frente->elemento;

cola->frente=cola->frente->siguiente;

free(nuevo);

}

else

printf("ERROR, cola vacia, se puede eliminar\a\n");

return (temp);

}

int estavacia (Cola cola)

{
    int resp;

    if (cola.frente == NULL)
    {
        resp = TRUE;
    }
    else
    {
        resp = FALSE;
    }

    return (resp);

}


nicolas_cof

#7
Seguis teniendo el error que te explico Littlehorse

Salu10.

Littlehorse

El código mantiene errores similares al código inicial. Presta atención a los mensajes de error:

Citar69: incompatible types in assignment

lista = crearcola (cola);

Que es lista? que devuelve crearcola?

el prototipo que declaraste es:

Nodo crearcola(Cola *cola);

Como veras, si lo analizas minuciosamente te darás cuenta que estas cometiendo un error. (204: error: incompatible types in return)

Si vas a devolver una referencia, la función debe ser similar a:

Nodo* crearcola(Cola *cola)

O bien puedes hacer algo como:

typedef struct nodo* Nodo;

pero por supuesto si haces esto ultimo tienes que tener cuidado cuando declaras un puntero a nodo en las funciones (ya que no necesitas el asterisco)

Como recomendación déjame decirte que vas a tardar menos repasando punteros, estructuras y funciones, que arreglando el código. Repasa y replantea el ejercicio y veras que es mas fácil de lo que parece.
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

Adry89

Pues me quedan estos 5 fallos :

hdrhdrh.c:59: error: incompatible types in assignment
hdrhdrh.c:79: error: incompatible types in assignment
hdrhdrh.c:175: error: incompatible type for argument 1 of `estavacia'
hdrhdrh.c:182: error: incompatible types in assignment
hdrhdrh.c:194: error: incompatible types in return

Littlehorse, la verdad es que soy bastante novata y no entiendo bien lo que has dicho, sería mucho pedir si me poesn lo que queda de código como le harías tu? Gracias.

#include <stdio.h>
#include <stdlib.h>
#define TAM 30
#define TRUE 1
#define FALSE 0

/*declaracion de la cola*/

typedef struct _DATOS
{
    char nombre[20];
    char apellidos[30];
    char telefono[12];
    char movil[12];
    int edad;

}DATOS;

struct nodo
{

DATOS elemento;

struct nodo *siguiente;

};

typedef struct nodo Nodo;

typedef struct
{

Nodo *frente;

Nodo *final;

}Cola;

/*Prototipos de funciones*/

Nodo crearcola(Cola *cola);
Nodo insertar (Cola *cola, DATOS x);
Nodo borrar (Cola *cola);
int estavacia (Cola cola);
DATOS leer ( void );

int main(void)
{

/*Declaracion de variables locales*/

Nodo *lista;
int num;
DATOS dat;
Cola *cola;

/*Algoritmo*/

lista = crearcola (cola);

   do
   {

   printf("--------------------------------\n\n");
   printf("Bienvenido a la agenda del movil \n\n");
   printf("elige una opcion : \n\n");
   printf("1.-Añadir. \n");
   printf("2.-Borrar.\n");
   printf("4.-Salir.\n");

   printf("Su opcion es: ");
   scanf("%d",&num);

    switch(num)
    {

        case 1 :  printf("Introduce los valores del dato");
                  dat = leer ();
                  lista = insertar (cola,dat);
        break;

        case 2 :  borrar (cola);
        break;

        case 3 :
        break;

      default : printf("Error: Introduce un numero del menu");

    }

   }while(num!=3);


   return(0);

}



/*definicion de las funciones*/

DATOS leer ( void )
{

    /*Declaracion de variables locales*/

    DATOS d;

    /*Algoritmo*/

   printf("Introduce Nombre: ");
   scanf("\n%s", d.nombre);
   printf("Introduce Apellido: ");
   scanf("\n%s",d.apellidos);
   printf("Introduce Telefono: ");
   scanf("\n%s",d.telefono);
   printf("Introduce Movil: ");
   scanf("\n%s",d.movil);
   printf("Introduce Edad: ");
   scanf("%d",&d.edad);

   return(d);
}

Nodo crearcola(Cola *cola)

{

cola->frente=cola->final=NULL;

}

/*funcion que inserta el dato en la parte final de la cola*/

Nodo insertar (Cola *cola, DATOS x)

{

Nodo *nuevo;

nuevo=(Nodo*)malloc(sizeof(Nodo));

nuevo->elemento=x;

nuevo->siguiente=NULL;

if(estavacia(*cola))

{

cola->frente=nuevo;

}

else

cola->final->siguiente=nuevo;

cola->final=nuevo;

}

/*elimina el elemento que esta aL frente de la cola*/

Nodo borrar (Cola *cola)

{

Nodo *temp;
Nodo *nuevo;

temp = NULL;

if(!estavacia(cola))

{


nuevo=cola->frente;

temp=cola->frente->elemento;

cola->frente=cola->frente->siguiente;

free(nuevo);

}

else

printf("ERROR, cola vacia, se puede eliminar\a\n");

return (temp);

}

int estavacia (Cola cola)

{
    int resp;

    if (cola.frente == NULL)
    {
        resp = TRUE;
    }
    else
    {
        resp = FALSE;
    }

    return (resp);

}