Bonjour, j'ai grand besoin d'aide pour débugguer mon programme; si quelqun pouvait m'aider ce serait sympas; voilà les erreurs

arbre.c: In function ‘empile’:
arbre.c:72:5: error: dereferencing pointer to incomplete type
tmp->feuille = feuille;
^
arbre.c:73:5: error: dereferencing pointer to incomplete type
tmp->suivant = p;
^
arbre.c: In function ‘depile’:
arbre.c:79:21: error: dereferencing pointer to incomplete type
GRD *feuille = (*p)->feuille;
^
arbre.c:82:11: error: dereferencing pointer to incomplete type
*p = (*p)->suivant;
^
unit_test_itArbre.c: In function ‘triIteratifGRD’:
unit_test_itArbre.c:12:4: warning: assignment from incompatible pointer type [enabled by default]
a=(depile(&p));
^
unit_test_itArbre.c:17:9: error: incompatible types when assigning to type ‘struct unfeuille’ from type ‘struct unfeuille **’
(*a)=depile(&p);

Voici mes prototypes

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct unfeuille {
	int val;
	struct unfeuille *gauche;
	struct unfeuille *droite;
}feuille;
typedef struct unfeuille * GRD;
 
typedef struct elpile {
  GRD* feuille;
  struct elpile* suivant; //pointeur sur la feuille suivante
 }pile;
 
typedef struct pile* PILE;
A partir de ça, voici mon algo de tri itératif

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void triIteratifGRD(GRD a)
{
	PILE p=initpile();
	while(!pilevide(p))
	{
		a=(depile(&p));
		if(estVideGRD(a))
		{
			if(!pilevide(p))
			{
				(*a)=depile(&p);
				printf("%d\n",(a)->val);
			}
		}
		else
		{
			p=empile(p,&((a)->gauche));
			p=empile(p,&(a));
			p=empile(p,&((a)->droite));
		}
	}
}
Ainsi que les fonctions pour empiler/depiler

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PILE empile(PILE p, GRD *feuille)
{
	PILE tmp = malloc(sizeof(&tmp));
 
	if (tmp == NULL)
	{
		puts("pb memoire");
		exit(0);
	}
	tmp->feuille = feuille;
	tmp->suivant = p;
	return tmp;
}
 
GRD* depile(PILE *p)
{
	GRD *feuille = (*p)->feuille;
 
	PILE tmp = *p;
	*p = (*p)->suivant;
	free(tmp);
 
	return feuille;
}

Malheureusement je n'arrive toujours pas à compiler et je ne vois pas quelle solution adopter. Un tri de manière récursif est pourtant si simple

J'ai grand besoin d'aide là dessus; merci à tous !