Pile en C

Fermé
AviateurRex - 1 oct. 2021 à 01:01
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 11 oct. 2021 à 14:51
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;
}


[code]//
// 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);

}
[/code]


#   	
# 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 "".

J'ai pensé a modifier la structure de l'élément de la façon suivante :

typedef struct {
char *first_string;
int integer_value;
char *second_string;
} Element;


Mais toujours rien.

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 !



Configuration: Windows / Chrome 94.0.4606.61
A voir également:

24 réponses

Donc au final j'obtiens:

 struct SCellule  * c = p->sommet;
 Element el=c->info;
 c=c->psuiv

printf("%s,0x%X,%x\n",el.first_string,el.integer_value,el.second_string); 


Mais pour le résultat je n'obtient que les sommets et pas la pile en entière :

/// Résultat ///
Affichage des 3 élement(s) de la pile:
fonction#3,0x7F543230,12456
Affichage des 2 élement(s) de la pile:
fonction#2,0x7F543230,987654
1
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
9 oct. 2021 à 18:41
Poste ton code entier pour ta fonction
void pileAfficher(Pile p)
, car ton affichage ne correspond pas au code que tu postes.

Fais le seulement après avoir fait l'effort de réfléchir par toi même à ce que tu fais et avoir tenté de déboguer ton code, au lieu de poster un truc approximatif toutes les 5 minutes avec une réflexion superficielle.

Je dois m'absenter pendant plusieurs heures.

A toi de jouer.
0
AviateurRex > [Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024
9 oct. 2021 à 18:49
Je te souhaite une bonne soirée ! En espérant que j'aurai bien avancé d'ici ton retour x)
0