|
|
|
|
Bonjour,
Je realise un programme, ayant pour but la réalisation d'une liste chainée en c++.
Ce programme comporte deux classe avec cette arborescence :
main.cpp
|__Pile.cpp
|__Pile.h
|__Noeud.cpp
|__Noeud.h
#include <iostream>
#include "Pile.h"
using namespace std;
int main()
{
Pile P1 ;
P1.ajouter("Dupond");
P1.inserer("Alfred");
P1.ajouter("Dupont");
P1.inserer("Anette");
P1.afficher();
P1.effacer();
P1.afficher();
return 0 ;
}
#ifndef NOEUD_H_
#define NOEUD_H_
class Noeud {
public:
Noeud();
~Noeud();
void modifierSuivant(Noeud*);
void modifierDonnees(char*);
Noeud *valeurSuivant();
char *valeurDonnees();
private:
Noeud *suivant ;
char *donnee ;
};
#endif
#include "Noeud.h"
#include <stdio.h>
Noeud::Noeud() {
suivant = NULL ;
donnee = NULL;
}
Noeud::~Noeud() {
delete suivant ;
delete[] donnee ;
}
void Noeud::modifierSuivant(Noeud *s)
{
suivant = s;
}
void Noeud::modifierDonnees(char* txt)
{
donnee = txt ;
}
Noeud* Noeud::valeurSuivant()
{
return suivant;
}
char* Noeud::valeurDonnees()
{
return donnee;
}
#ifndef PILE_H_
#define PILE_H_
#include "Noeud.h"
class Pile {
public:
Pile();
~Pile();
void inserer(char*);
void ajouter(char*);
void afficher();
void effacer();
private:
Noeud *adresse ;
};
#endif
#include <iostream>
#include <stdio.h>
#include "Pile.h"
Pile::Pile()
{
adresse = NULL ;
}
Pile::~Pile()
{
Noeud *suivant;
while(adresse != NULL)
{
suivant = adresse->valeurSuivant() ;
delete adresse ;
Noeud *adresse; adresse = suivant ;
}
delete adresse ;
}
void Pile::inserer(char* txt)
{
Noeud *suivant, *precedent;
while(adresse != NULL)
{
precedent = adresse ;
suivant = adresse->valeurSuivant() ;
adresse = suivant ;
}
Noeud *N ; N = new Noeud ;
precedent->modifierSuivant(N);
precedent->modifierDonnees(txt);
}
void Pile::ajouter(char* txt)
{
Noeud *N ; N = new Noeud ;
N->modifierSuivant(&(*adresse));
N->modifierDonnees(txt);
}
void Pile::afficher()
{
if (adresse = NULL)
std::cout<< "la pile est vide\n" ;
else while(adresse != NULL)
{
std::cout<< adresse->valeurDonnees()<<"\n" ;
adresse = adresse->valeurSuivant();
}
}
void Pile::effacer()
{
Noeud *suivant;
while(adresse != NULL)
{
suivant = adresse->valeurSuivant() ;
delete adresse ;
Noeud *adresse; adresse = suivant ;
}
}
Configuration: Code::blocks 8.02
Je n'ai pas essayé le programme, mais l'ai simplement lu; voici donc les coquilles trouvées de-ci de-là.
void Pile::afficher()
{
if (adresse = NULL)Il faut doubler les parenthèses si c'est vraiment ce que l'on veut, mais comme ce n'est pas le cas ici, il faut mettre if (adresse == NULL).
*** Ensuite pour les autres types d'erreur: - Tu es en C++, alors pourquoi enfiler des vieux 'char*', sois moderne -> utilise des 'string' ! ;-) - Qu'est ce que delete suivant; et delete[] donnee;? Je n'ai pas vu de new suivant ni de new donnee[x], - Noeud* N; N = new Noeud; se simplifie par Noeud* N = new Noeud;, *** Finissons par la plus grosse coquille: Dans la classe Pile, adresse, c'est une catastrophe! - 'adresse' n'est jamais initialisée (sauf à NULL) et même pas dans 'inserer' car comme au départ adresse est NULL, on ne va jamais rentrer dans la boucle 'while...'. - Que veux-tu faire avec: N->modifierSuivant(&(*adresse)); ? A moins d'avoir loupé un épisode '&(*adresse)' est équivalent à 'adresse'... - mais le comble arrive avec cette portion de code: Pile::~Pile()
{
Noeud *suivant;
while(adresse != NULL)
{
suivant = adresse->valeurSuivant() ;
delete adresse ;
Noeud *adresse; adresse = suivant ;
}
delete adresse ;
}Noeud *adresse; adresse = suivant; ne sert strictement à rien; je crois que tu confond 'adresse' qui vient d'être défini avec 'adresse' qui est défini dans la classe. D'autre part, la boucle tourne tant que adresse est NULL et en sortant (donc: adresse == NULL) tu fais un 'delete adresse'.
Il y a sans doute d'autres coquilles, mais je crois qu'il faut que tu reprennes beaucoup de choses, à commencer par la logique car la gestion de 'adresse' ne me parait pas claire du tout. Bon courage. |