Implémenter et manipuler une pile de caracter

angellmimi -  
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité -
Bonjour,ds l'ex il s'agit d'implémenter et de manipuler une pile de caractères , en utilisant la représentation contigue d'une pile ,g deja implémenté la structure de données Pile , mais qd g programmé une fonction main pr testé la pile caracteres, lors de l'execution ca marche pas , voila mon programme :

//pile.h :
#ifndef _pile_h_
#define _pile_h_

#include <stdio.h>
#include<stdlib.h>
typedef int Element ;
typedef struct Pile {
int sommet ;
char *tab;
Element *element;
}pile;
pile empiler ( pile p , char caract) {
p.sommet++;
p.element[p.sommet]=caract;
return p ;}
pile depiler ( pile p){
if(p.sommet==-1) {
printf("il n'y a rien a depiler");
}
else {
printf(" le caracatere a depiler est %c ",p.element[p.sommet]);
p.element[p.sommet]='\0';
p.sommet--;
}
return p ;
}
void taille (pile p ){
printf("la taille de la pile est %d",p.sommet+1);
}
void sommet (pile p ){
if ( p.sommet=-1 ) {
printf(" la pile est vide : ");
}
else {
printf ( " le sommet de la pile est : %c ",p.element[p.sommet]);
}
}
void affichage (pile p){char n,i ;
if ( p.sommet=-1 ) {
printf(" la pile est vide : ");
}
n = p.sommet ;
while ( n > -1 ){

printf(" %c ",p.element[n]);
n--;
}
}
int main (){char ch ; int compt;pile p;char ch_;
printf ("-------------------------------------MENU---------------------------------------\n\n");
printf (" \n1- empiler un caractere dans la pile : \n");
printf (" \n2- depiler un caractere de la pile : \n");
printf (" \n3- taille de la pile : \n");
printf (" \n4- sommet de la pile : \n");
printf (" \n5- afficher le contenu de la pile : \n");
printf (" \n6- quitter le programme : \n\n");
scanf("%d",&compt);
if ( compt ==1){
printf ("entrer le caracatere a empiler :");
scanf("%c",&ch);
p =empiler ( p , ch );
}
else if (compt==2) { printf ("entrer le caracatere a depiler :");
scanf("%c",&ch_);
p =depiler ( p );
}
else if (compt==3) { taille ( p ); }
else if (compt==4) { sommet ( p); }
else if (compt==5) { affichage (p); }
else if (compt== 6 ){ exit (-1);}


si kelk1 pouvais m'aider .. MERCI

1 réponse

lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité 3 570
 
Salut,

par exemple dans la fonction

pile empiler (pile p, char caract)
{
p.sommet++;
p.element[p.sommet] = caract;
return p;
}



p.sommet++ peut contenir n'importe quoi puisque p.sommet n'est pas initialisé
element c'est un pointeur de type Element (un int), si tu ne va pas allouer de la mémoire tu auras sûrement une Erreur de segmentation.

Personnellement pour l'implementation d'une plie j'aurais plutôt utilisé une liste chaînée (tu peux regarder ici pour un exemple http://www.commentcamarche.net/faq/sujet 8283 les piles en langage c

0