Lang c
Résolu
alicia85
Messages postés
68
Date d'inscription
Statut
Membre
Dernière intervention
-
Nabla's Messages postés 18203 Date d'inscription Statut Contributeur Dernière intervention -
Nabla's Messages postés 18203 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,comment aller vous j ai un pb sur la verification de la syntaxe d une chaine de caratere j utilise les piles mais mon programme plante voici les procedures pr gerer la pile est ce que c est bon ?
j ai un pb au niveau de depiler et pilevide
j ai un pb au niveau de depiler et pilevide
8 réponses
voici le code
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef union enreig{
char c;
int valeur;
}tab;
typedef struct noeud{
tab enreig;
struct neoud *suiv;
}pile;
void creepile(pile**p){
*p=NULL;
}
tab sommet(pile*p){
return(p->enreig);
}
int pilevide(pile *p){
return(p==NULL);
}
int taille_pile(pile*p){
pile *l=p;
int i=0;
while((l!=NULL)&&(++i))
l=l->suiv;
return(i);
}
int empiler(pile**p,const tab t){
{pile*l;
l=(pile*)malloc(sizeof(pile));
if(l!=NULL){
// l->enreig=(tab*)malloc(sizeof(tab));
// if (l->nom!=NULL){
l->enreig=t;
l->suiv=*p;
*p=l;
}
else{
free(l);
l=NULL;
}
return(l!=NULL);
}
void depiler(pile**p){
pile*l;
l=*p;
*p=*p->suiv;
free(l);
}
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef union enreig{
char c;
int valeur;
}tab;
typedef struct noeud{
tab enreig;
struct neoud *suiv;
}pile;
void creepile(pile**p){
*p=NULL;
}
tab sommet(pile*p){
return(p->enreig);
}
int pilevide(pile *p){
return(p==NULL);
}
int taille_pile(pile*p){
pile *l=p;
int i=0;
while((l!=NULL)&&(++i))
l=l->suiv;
return(i);
}
int empiler(pile**p,const tab t){
{pile*l;
l=(pile*)malloc(sizeof(pile));
if(l!=NULL){
// l->enreig=(tab*)malloc(sizeof(tab));
// if (l->nom!=NULL){
l->enreig=t;
l->suiv=*p;
*p=l;
}
else{
free(l);
l=NULL;
}
return(l!=NULL);
}
void depiler(pile**p){
pile*l;
l=*p;
*p=*p->suiv;
free(l);
}
Dans la fonction depiler, j'ai trouvé ton erreur : quand tu fais *p = *p->suiv, tu dois mettre des parenthèses : *p = (*p)->suiv;. Sans ça, il interprète ta ligne comme ça en fait : *p = *(p->suiv); et en effet, dans ce cas là, p n'est pas une structure mais un pointeur de pointeur sur ta structure. Je n'ai pas d'autres erreurs de compilation.
Juste un conseil, dans ta fonction empiler il vaut mieux éviter le else {free(l) ; l = NULL}. Si on arrive là, c'est que justement l vaut déjà null et n'a pas été initialisé. Si tu fais un free() dessus, tu feras un free(NULL) et ça peut être assez mauvais.
Juste un conseil, dans ta fonction empiler il vaut mieux éviter le else {free(l) ; l = NULL}. Si on arrive là, c'est que justement l vaut déjà null et n'a pas été initialisé. Si tu fais un free() dessus, tu feras un free(NULL) et ça peut être assez mauvais.
merci beaucoup pour tout mais j ai un pb avec mon code lorsque je l execute le fichier executable disparait apres avoir entrer le s données bien qu'ayant getch() ou getchar a la fin du main .que faire ? merci d'avance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
je pense plutot que tu dois faire p=p->suiv , ca deplace le pointeur. dans l autre cas, si ca marche ca copie l objet complet.
pour ton getchar qui bloc pas, il faut vider le buffer d entrée: flush.
je me rapelle plus de la syntaxe, peut etre es ce flush(stdin) ...
pour ton getchar qui bloc pas, il faut vider le buffer d entrée: flush.
je me rapelle plus de la syntaxe, peut etre es ce flush(stdin) ...
Justement, il vaut mieux déplacer juste le pointeur plutôt que l'objet complet quand tu traites une pile...
Remplace ton getchar() par un scanf("%s", NULL), ça attendra que l'utilisateur tape "entrée" pour continuer.
Remplace ton getchar() par un scanf("%s", NULL), ça attendra que l'utilisateur tape "entrée" pour continuer.