typedef struct maillon *LIST;
C'est une mauvaise idée de cacher dans un typedef que le type est un type adresse
1 2 3 4 5 6 7 8 9 10
| typedef struct maillon{
struct maillon * next;
void* data;
} Maillon;
typedef struct{
Maillon * pile;
int taille;
int haut; // A quoi sert ce champ ?
}STACK2; |
1 2 3 4 5 6 7 8
| STACK2 new_stack2 ()
{
STACK2 p;
(p.pile)->next = NULL; // Ici, on va planter
// p.pile vaut n'importe quoi et par conséquent (p.pile)->next est dans les décors
// Pour indiquer que la pile est vide p.pile = NULL suffit.
....
} |
1 2 3 4 5 6 7 8
| void delete_list ( LIST l )
{
while( l->next != NULL )
{
delete_list(l->next);
free(l);
}
} |
est mal foutu : soit tu optes pour une solution itérative, soit pour une solution récursive. Mais le mélange des deux ...
1 2 3 4 5 6 7 8
| void delete_stack2 ( STACK2 p )
{
delete_list ( p.pile );
free( p.haut );// On va planter ici
free( p.taille); // et ici
// p.haut et p.taille n'ont pas été initialisés par un malloc.
// D'ailleurs, ce ne sont pas des adresses mais des entiers.
} |
Pour cette fonction, elle cherche à modifier des éléments de la structure utilisée pour représenter la pile. Il faut donc passer l'adresse de cette structure, sinon on ne va modifier que la copie locale :
1 2 3 4 5 6
| void delete_stack2 ( STACK2 * p )
{
delete_list ( p->pile );
p->pile = NULL ;
....
} |
On verra la suite plus tard
Partager