Listes chainées : problemes

balin -  
 loupius -
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


La compilation marche, mais le programme n'affiche rien
Je poste mes fichiers :

/* main.cpp */
#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 ;
}

/*fin de main.cpp*/

/*Noeud.h*/
#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


/*fin de Noeud.h*/

/*Noeud.cpp */
#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;
}

/*fin de Noeud.cpp*/

/*Pile.h*/
#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

/*fin de Pile.h*/

/*Pile.cpp*/
#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 ;
	}
}

/*fin de Pile.cpp*/

voila, si vous trouver ce qui cloche je vous serais très reconnaissant. (donnez des explication je veux comprendre ! )

1 réponse

loupius
 
Je n'ai pas essayé le programme, mais l'ai simplement lu; voici donc les coquilles trouvées de-ci de-là.
*** D'abord le compilateur doit râler en voyant:
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.
0