Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 24/09/2021, à 11:52

Avi

Pile en C

Bonjour à tous,
J'ai quelque modifications à apporter à un scripte mais je n'y arrive pas. Le but de mon projet est de créer une pile en C au format LIFO ( last in first out ) consistant donc a ajouter / supprimer des éléments, le seul élément avec lequel on peut interagir étant celui se trouvant au sommet de la pile.

J'ai donc les scripts suivants:

//   	
// Fichier pile.h
//   	

#include <stdio.h> 
#include <stdlib.h>
typedef float Element; 

struct SCellule {
     Element info;
     struct SCellule *psuiv;
};

typedef struct SCellule *Cellule; 

struct SPile{
      struct SCellule *sommet;
      int nbElements;
};

typedef struct SPile *Pile; Pile 

PileVide();

Pile pileAjouter(Pile p, Element e);

Pile pileSupprimer(Pile p);

Element *pileSommet(Pile p);

int pileLongueur(Pile p);
//   	
// Fichier pile.c
//   	

#include "pile.h"

Pile pileVide(){
       Pile p;

       p=(Pile)malloc(sizeof(struct SPile));
       p->nbElements = 0;
       p->sommet = (Cellule) NULL; 
      return (p);
}
 
Pile pileAjouter(Pile p, Element e){
       Cellule newSommet;

      newSommet = (Cellule)malloc(sizeof(struct SCellule)); 
      newSommet->info = e;
      newSommet->psuiv = p->sommet; 
      p->sommet = newSommet;
      p->nbElements=p->nbElements + 1;
     return (p);
}


Pile pileSupprimer(Pile p){ 
      Cellule tmp;

      if(p->nbElements == 0){ 
              return ((Pile)NULL);
      }
      tmp=p->sommet;
      p->sommet = tmp->psuiv; 
      free(tmp);
     p->nbElements = p->nbElements - 1; 
     return (p);
}

Element *pileSommet(Pile p){ 
            if(p->nbElements == 0){
                    return ((Element*)NULL);
             }
             return &(p->sommet->info);
}

int pileLongueur(Pile p){

          return p->nbElements;
}
//   	
// Fichier main.c
//   	

#include "pile.h"

int main(){
        Pile p; Element *elem;
        int estSommet=0;

        p=pileVide(); 
        pileAjouter(p,1); 
        pileAjouter(p,2); 
        pileAjouter(p,3);

       while(pileLongueur(p)>0){
 
               if(estSommet == 0){
                    printf("\nLe sommet de la pile est %0.2f\n\n",*pileSommet(p));
                   estSommet=1;
                }
                printf("| %0.2f |\n", *pileSommet(p)); 
                printf("------------\n");
               pileSupprimer(p);
       }

       return (0);

}
#   	
# Fichier Makefile
#   	

BIN = piles
OBJECTS = main.o pile.o 
CC = gcc

all: $(OBJECTS)
      $(CC) $(OBJECTS) -o $(BIN)

main.o: main.c pile.h
         $(CC) -c main.c

vitesse.o : pile.h pile.c
             $(CC) -c pile.c

clean:
       rm -f $(OBJECTS) $(BIN) *~

J'obtient donc avec ce code :

//   	
// Résultat
//   	

Le sommet de la pile est 3.00

| 3.00 |
----------
| 2.00 |
----------
| 1.00 |
---------

Ce qui est correcte. Maintenant il faudrait que je remplace les élements 1,2,3 de ma pile par : (‘’fonction#1’’, 0x7F543210, ‘’Ok’’) a la place du 1, (fonction#2’’, 0x7F543220, ‘’987654’’) a la place du 2 et  (‘’fonction#3’’, 0x7F543230, ‘’123456’’) a la place du 3. Mon code ne compilant que des éléments de type float j'ai essayé de convertir  chaque ligne de type str en float avec la fonction strtof() mais celle ci ne converti que les nombres englobé dans dans "".

Je dois donc avoir au final l'ordre d'execution suivant:

pileAjouter (‘’fonction#1’’, 0x7F543210, ‘’Ok’’) ;
pileAjouter (‘’fonction#2’’, 0x7F543220, ‘’987654’’) ;
pileAjouter (’fonction#3’’, 0x7F543230, ‘’123456’’) ;
pilelongueur (Pile) ;
pileafficher (Pile) ;
pileSupprimer (Pile) ;
pilelongueur(Pile) ;
pileafficher (Pile) ;

Merci pour votre aide !

Dernière modification par Avi (Le 24/09/2021, à 14:08)

Hors ligne

#2 Le 24/09/2021, à 12:26

grigouille

Re : Pile en C

On a la signature :

pileAjouter(Pile p, Element e)

Que signifie alors :

pileAjouter (‘’fonction#1’’, 0x7F543210, ‘’Ok’’) ;

Xubuntu 20.04
HP LaserJet M1132 MFP

Hors ligne

#3 Le 24/09/2021, à 13:53

Avi

Re : Pile en C

grigouille a écrit :

On a la signature :

pileAjouter(Pile p, Element e)

Cette section (pile.c) représente la structure de la fonction Ajouter, en aucun cas elle ne fait intervenir directement des paramètres.

grigouille a écrit :

Que signifie alors :

pileAjouter (‘’fonction#1’’, 0x7F543210, ‘’Ok’’) ;

Par contre dans la section main.c, les paramètres doivent être intégré afin d'être traité et ajouté à la pile.

Dernière modification par Avi (Le 24/09/2021, à 13:57)

Hors ligne