Probleme de piles avec listes chinées
cahornia
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
qui peut me corriger ce programme car quand je le compile il m'envois deux erreurs au niveau de la fonction affichage et plus precisemet dans le test et le free voula le programme
#include <conio.h>
#include <iostream.h>
using namespace std;
typedef struct {
int ref;
float prix;
}articl;
typedef articl typeEle;
typedef struct cel pile;
struct cel{
typeEle v;
pile* suiv;
};
pile* initialisation(){
return NULL;
}
bool estVide(pile*p){
return (p==NULL);
}
pile* empiler(pile* p,int ref,float prix){
pile* c;
c=(pile*)malloc(sizeof(pile));
c->v.ref=ref;
c->v.prix=prix;
c->suiv=p;
p=c;
return p;
}
void depiler(pile* p)
{pile* par;
par=p;
if(!estVide(*p))
free(par->v);
free(par);
}
void affiche(pile* p){
pile* par;
par=p;
if(par!=NULL)
{
cout<<"Referance : "<<par->v.ref<<endl;
cout<<" Prix : "<<par->v.prix<<endl<<endl;
affiche(par);
}
else
cout<<par->v.ref<<endl;
cout<<par->v.prix<<endl;
}
typeEle som(pile* p)
{
return p->v;
}
int main(){
int choix,reference;
typeEle valeur;
pile *sommet;
float prix;
sommet=initialisation();
do{
cout<<" Menu "<<endl;
cout<<"1- initialiser"<<endl;
cout<<"2- est vide"<<endl;
cout<<"3- empiler"<<endl;
cout<<"4- depiler"<<endl;
cout<<"5- Afficher la pile"<<endl;
cout<<"6- le sommet"<<endl;
cout<<"0 Quitter"<<endl;
cin>>choix;
switch(choix){
case 1:
sommet=initialisation();
break;
case 2:
cout<<estVide(sommet);
break;
case 3: {cout<<"taper la reference svp : "<<endl;
cin>>reference;
cout<<"taper le prix svp : "<<endl;
cin>>prix;
sommet=empiler(sommet,reference,prix);
}
break;
case 4:
depiler(sommet);
break;
case 5 : affiche(sommet);
break;
case 6 : som(sommet);
break;
}
}while(choix!=0);
return 0;
}
qui peut me corriger ce programme car quand je le compile il m'envois deux erreurs au niveau de la fonction affichage et plus precisemet dans le test et le free voula le programme
#include <conio.h>
#include <iostream.h>
using namespace std;
typedef struct {
int ref;
float prix;
}articl;
typedef articl typeEle;
typedef struct cel pile;
struct cel{
typeEle v;
pile* suiv;
};
pile* initialisation(){
return NULL;
}
bool estVide(pile*p){
return (p==NULL);
}
pile* empiler(pile* p,int ref,float prix){
pile* c;
c=(pile*)malloc(sizeof(pile));
c->v.ref=ref;
c->v.prix=prix;
c->suiv=p;
p=c;
return p;
}
void depiler(pile* p)
{pile* par;
par=p;
if(!estVide(*p))
free(par->v);
free(par);
}
void affiche(pile* p){
pile* par;
par=p;
if(par!=NULL)
{
cout<<"Referance : "<<par->v.ref<<endl;
cout<<" Prix : "<<par->v.prix<<endl<<endl;
affiche(par);
}
else
cout<<par->v.ref<<endl;
cout<<par->v.prix<<endl;
}
typeEle som(pile* p)
{
return p->v;
}
int main(){
int choix,reference;
typeEle valeur;
pile *sommet;
float prix;
sommet=initialisation();
do{
cout<<" Menu "<<endl;
cout<<"1- initialiser"<<endl;
cout<<"2- est vide"<<endl;
cout<<"3- empiler"<<endl;
cout<<"4- depiler"<<endl;
cout<<"5- Afficher la pile"<<endl;
cout<<"6- le sommet"<<endl;
cout<<"0 Quitter"<<endl;
cin>>choix;
switch(choix){
case 1:
sommet=initialisation();
break;
case 2:
cout<<estVide(sommet);
break;
case 3: {cout<<"taper la reference svp : "<<endl;
cin>>reference;
cout<<"taper le prix svp : "<<endl;
cin>>prix;
sommet=empiler(sommet,reference,prix);
}
break;
case 4:
depiler(sommet);
break;
case 5 : affiche(sommet);
break;
case 6 : som(sommet);
break;
}
}while(choix!=0);
return 0;
}
A voir également:
- Probleme de piles avec listes chinées
- Pile de bios - Guide
- Listes déroulantes excel - Guide
- Faut il mettre des piles rechargeables dans un téléphone fixe - Forum telephonie fixe
- Peut on mettre des piles rechargeables plus puissantes ✓ - Forum telephonie fixe
- Liste de diffusion whatsapp - Guide
1 réponse
quelques suggestions d'abord:
- "conio.h" n'est pas un fichier standard et donc il est à éviter à tout prix
- "iostream.h" est l'ancienne version du fichier "iostream" donc il vaut mieux écrire:
- ton programme est écrit en C uniquement mais "iostream" fait partie du C++
- je vais remplacer dans la solution l'utilisation des "cout" (language C++) par "printf" (language C), c'est mieux de faire du C quand on écrit tout son programme en C
- bool est un mot clé du C++, donc à éviter dans les programmes écrits en C, c'est pourquoi dans ma solution je change la fonction estVide qui renvoie maintenant un entier
Les erreurs:
dans la fonction "empiler", tu écris "p = c" mais p n'est qu'un pointeur, son contenu n'est pas modifié, cette ligne est à modifier et il faut remplacer la ligne suivante "return p" par "return c" !
dans la fonction "depiler", pas besoin de faire un "free" sur l'article, c'est une variable dont la mémoire est gérée automatiquement, c'est uniquement la pile dont il faut libérer la mémoire
dans la fonction "affiche", si "par" est NULL, on ne peut pas la mémoire par l'instruction "par->v...", c'est un crash immédiat du programme !
à cause des "malloc" il faut appeler la fonction "detruirePile" à la fin de ton programme pour libérer proprement la mémoire.
Le code customizé:
- "conio.h" n'est pas un fichier standard et donc il est à éviter à tout prix
- "iostream.h" est l'ancienne version du fichier "iostream" donc il vaut mieux écrire:
#include <iostream> using namespace std;
- ton programme est écrit en C uniquement mais "iostream" fait partie du C++
- je vais remplacer dans la solution l'utilisation des "cout" (language C++) par "printf" (language C), c'est mieux de faire du C quand on écrit tout son programme en C
- bool est un mot clé du C++, donc à éviter dans les programmes écrits en C, c'est pourquoi dans ma solution je change la fonction estVide qui renvoie maintenant un entier
Les erreurs:
dans la fonction "empiler", tu écris "p = c" mais p n'est qu'un pointeur, son contenu n'est pas modifié, cette ligne est à modifier et il faut remplacer la ligne suivante "return p" par "return c" !
dans la fonction "depiler", pas besoin de faire un "free" sur l'article, c'est une variable dont la mémoire est gérée automatiquement, c'est uniquement la pile dont il faut libérer la mémoire
dans la fonction "affiche", si "par" est NULL, on ne peut pas la mémoire par l'instruction "par->v...", c'est un crash immédiat du programme !
à cause des "malloc" il faut appeler la fonction "detruirePile" à la fin de ton programme pour libérer proprement la mémoire.
Le code customizé:
/* pour printf: */
#include <stdio.h>
/* pour malloc: */
#include <stdlib.h>
/* un article */
typedef struct s_article {
int ref;
float prix;
} article;
/* une cellule */
typedef struct s_cell {
article v;
struct s_cell *suivant;
} cell;
/* une pile est une liste chaînée de cellules */
typedef cell pile;
pile *initialisation() {
return NULL;
}
/* estVide renvoie 1 si la pile est vide, 0 sinon */
int estVide(pile *p) {
return p == NULL;
}
pile *empiler(pile *p, int ref, float prix) {
pile *c = (pile *) malloc(sizeof(pile));
/* simple vérification d'erreur... */
if (c == NULL) return NULL;
c->v.ref = ref;
c->v.prix = prix;
c->suivant = p;
return c;
}
/* Attention: il faut faire "p = depiler(p)" à chaque fois ! */
pile *depiler(pile *p) {
/* dépiler est compliqué, il faut vérifier si la liste est vide
et supprimer le premier élément sans casser le reste de la pile */
/* rien à faire si la liste est vide */
if (estVide(p)) return p;
/* on garde un pointeur vers le 2nd élément */
pile *suivant = p->suivant;
/* on libère le premier */
free(p);
/* et on renvoie le second qu'on a gardé */
return suivant;
}
void affiche(pile *p) {
if (p != NULL) {
printf("Référence: %d\n", p->v.ref);
printf("Prix: %f\n", p->v.prix);
affiche(p->suivant);
}
}
void detruirePile(pile *p)
{
pile *suivant;
if (p != NULL) {
suivant = p->suivant;
free(p);
detruirePile(suivant);
}
}