PILE AIDE [C] moi svp

Résolu/Fermé
fabrice - 7 févr. 2009 à 01:27
 fabrice - 7 févr. 2009 à 11:47
Bonjour,
j'ai un programme de pile que je veux faire en chaine de caractere
je connais le principe en entier mais sa ne veut pas se compiler en char
voilà le programme en entier


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


typedef struct {
        
        int max;
        int n; /* repere le dernier occupe de Element */
        int *element;
        } pile;
        
        
        
        
        
void initpile(pile *p,int max){
    
    p->max=max;
    p->n=-1;
    p->element=(int*)malloc(max*sizeof(int));
     
     }
     
int pilevide(pile *p){
    return p->n==-1;
}
                         

void empiler(pile *p,int v){ 
     if(p->n < p->max-1) {               
                p->n++;
                p->element[p->n]=v;  }
      else {
             printf("Erreur : Pile saturee !!");}
 
     }
     
int depiler(pile *p,int *v){ 
    
                      *v=p->element[p->n];
                      p->n--;
                                     
     
     }
     
     
void listerpile(pile *p){
     int i;
      if(pilevide(p)) {
      printf("Erreur : Pile vide !!\n");
     } else { for(i=0;i<=p->n;i++){
              printf("%d\t",p->element[i]);
              }
              }
              }
     
void dertruirepile(pile *p){
     free(p->element);
     }          
     
int menu() {
    int cod;
    printf("\n\n GESTION D'UNE PILE \n\n");       
     printf("0 - Quitter\n"); 
      printf("1 - Initialisation de la pile\n");  
      printf("2 - La pile est-elle vide ?\n");
      printf("3 - Insertion dans la pile\n");              
       printf("4 - Retrait de la pile\n"); 
       printf("5 - Listage de la pile\n"); 
       printf("\n");
       printf("Votre choix ? : ");scanf("%d",&cod);
       printf("\n");
       return cod;
       }
       
       
main()
{
      
  pile p1;
  pile *pp1=&p1;
  int t,v,fini=0;    
      

printf("Taille de la pile d'entiers ? :");
scanf("%d",&t);

initpile(pp1,t);

while(!fini){
             switch(menu()){
                            
       case 0 : fini=1;exit(0);break;
      
       case 1 :dertruirepile(pp1);
       printf("Taille de la pile d'entiers ? :");
       scanf("%d",&t);
       initpile(pp1,t);
       break;
       
        case 2 :if(pilevide(pp1)) {
      printf("Pile vide !!\n");
     } else {printf("Pile non vide !!\n");}break;
       
     case 3 :printf("Valeur empiler ? :");
     scanf("%d",&v);empiler(pp1,v);break;   
     
     case 4 : 
          if(pilevide(pp1))
          printf("pile vide ");
          else
          depiler(pp1,&v);
          printf("%d",v);
          break;
          
     case 5 : listerpile(pp1);break;     
          
          }
         
          
      getch();
}
}






voilà ce que j'ai essayer



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


typedef struct {
        
        int max;
        int n; /* repere le dernier occupe de Element */
        char *element;
        } pile;
        
        
        
        
        
void initpile(pile *p,int max){
    
    p->max=max;
    p->n=-1;
    p->element=(char*)malloc(max*sizeof(char));
     
     }
     
int pilevide(pile *p){
    return p->n==-1;
}
                         

void empiler(pile *p,char *v){ 
     if(p->n < p->max-1) {               
                p->n++;
                p->element=v;  }
      else {
             printf("Erreur : Pile saturee !!");}
 
     }
     
int depiler(pile *p){ 
    
                      
                      p->n--;
                                     
     
     }
     
     
void listerpile(pile *p){
     int i;
      if(pilevide(p)) {
      printf("Erreur : Pile vide !!\n");
     } else { for(i=0;i<=p->n;i++){
              printf("%d\t",p->element[i]);
              }
              }
              }
     
void dertruirepile(pile *p){
     free(p->element);
     }          
     
int menu() {
    int cod;
    printf("\n\n GESTION D'UNE PILE \n\n");       
     printf("0 - Quitter\n"); 
      printf("1 - Initialisation de la pile\n");  
      printf("2 - La pile est-elle vide ?\n");
      printf("3 - Insertion dans la pile\n");              
       printf("4 - Retrait de la pile\n"); 
       printf("5 - Listage de la pile\n"); 
       printf("\n");
       printf("Votre choix ? : ");scanf("%d",&cod);
       printf("\n");
       return cod;
       }
       
       
main()
{
      
  pile p1;
  pile *pp1=&p1;
  int t,fini=0;    
  char *v;

printf("Taille de la pile d'entiers ? :");
scanf("%d",&t);

initpile(pp1,t);

while(!fini){
             switch(menu()){
                            
       case 0 : fini=1;exit(0);break;
      
       case 1 :dertruirepile(pp1);
       printf("Taille de la pile d'entiers ? :");
       scanf("%d",&t);
       initpile(pp1,t);
       break;
       
        case 2 :if(pilevide(pp1)) {
      printf("Pile vide !!\n");
     } else {printf("Pile non vide !!\n");}break;
       
     case 3 :printf("Valeur empiler ? :");
     scanf("%s",v);empiler(pp1,v);break;   
     
     case 4 : 
          if(pilevide(pp1))
          printf("pile vide ");
          else
          depiler(pp1);
          printf("%d",v);
          break;
          
     case 5 : listerpile(pp1);break;     
          
          }
         
          
      getch();
}
}



AIDEZ MOI SVP;

5 réponses

Azer_Ty Messages postés 104 Date d'inscription vendredi 31 octobre 2008 Statut Membre Dernière intervention 4 juillet 2011 60
7 févr. 2009 à 02:34
En gros tu veux empiler des chaines de caractères, c'est ça ?

Si oui le problème est là :
char* correspond à une chaine de caractères, donc pour avoir un tableau de chaines de caractères utilise plutôt char*[20] par exemple.

Si non je ne vois pas.
0
Bonjour

Si comme tu le dis ce sont bien des char que tu veux empiler (et pas des chaînes) :

1-
Ta fonction oid empiler(pile *p,char *v){
if(p->n < p->max-1) {
p->n++;
p->element=v; }

n'est pas cohérente . Le paramètre v passé devrait être un char, pas un char * puis que c'est un caractère que tu empiles et pas une chaîne.

2- Dans listerpile, tu pourrais utiliser %c plutôt que %d pour afficher (essaye pour voir la différence)

3- dans ton case 3 (insertion) tu ne devrais insérer que le premier caractère et pas toute la chaine : empiler (ppl,v[0])
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
7 févr. 2009 à 11:00
Salut,

Peut être une implémentation par liste chaînée est plus facile;-)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

typedef struct Element{
	char nom[50];
	struct Element *suivant;
}Pile;

Pile *Initialiser(){
	return NULL;
}

int PileVide(Pile *P){
	if(P==NULL)
		return 1;
	return 0;
}

int PilePleine(Pile *P){
	return 0; // elle ne peut pas être vide
	          // toutefois la taille de la pile est limité par la mémoire
}

void Empiler(Pile **P,char *nom){
	Pile *nouveau;
	nouveau = (Pile *) malloc (sizeof(Pile));
	strcpy(nouveau->nom,nom);
	nouveau->suivant = *P;
	*P = nouveau;
}

int Depiler(Pile **P, char *nom){
	Pile *suppr;
	if(PileVide(*P))
		return 0;
	strcpy(nom,(*P)->nom);
	suppr = *P;
	*P=(*P)->suivant;
	free(suppr);
	return 1;
}

void Detruire(Pile **P){
	Pile *suppr;
	while(*P!=NULL){
		suppr=*P;
		*P=(*P)->suivant;
		free(suppr);
	}
	*P=NULL;
}

void Affiche(Pile *P){
	Pile *courant;
	for(courant=P;courant!=NULL;courant=courant->suivant)
		printf("%s ",courant->nom);
	printf("\n");
}
int main()
{
	char mot[50];;
	Pile *P;

	P = Initialiser();

	printf("Entrez mot : ");
	scanf("%s",mot);
	Empiler(&P,mot);
	Affiche(P);

	printf("Entrez mot : ");
	scanf("%s",mot);
	Empiler(&P,mot);
	Affiche(P);

	printf("Entrez mot : ");
	scanf("%s",mot);
	Empiler(&P,mot);
	Affiche(P);

	if(Depiler(&P,mot))
		printf("Dernier Entré / Premier Sorti : %s\n",mot);
	Affiche(P);
	Detruire(&P);
	Affiche(P);

	return 0;
}
Resultat
lami20j@debian:~/trash/ccm_c$ gcc ccm48_pile_listechainee.c
lami20j@debian:~/trash/ccm_c$ ./a.out
Entrez mot : AAA
AAA
Entrez mot : BBB
BBB AAA
Entrez mot : CCC
CCC BBB AAA
Dernier Entré / Premier Sortie : CCC
BBB AAA

0
S'il vous plait pouvez vous modifier tout le programme
sa va pas vous prendre trop de temps
moi j'arrive pas a le faire
svp :(
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Merci lami pour la reponse ;) c résolu
0