Rechercher : dans
Par :

Listes chainées : problemes

Dernière réponse le 1 mar 2009 à 17:54:36 balin, le 28 fév 2009 à 23:42:13 
 Signaler ce message aux modérateurs

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 ! )
Configuration: Code::blocks 8.02

Meilleures réponses pour « listes chainées : problemes » dans :
Liste simplement chaînée VoirLISTES SIMPLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes chaînées A. Initialisation B. Insertion d'un élément dans la liste 1. Insertion...
Liste doublement chaînée VoirLISTES DOUBLEMENT CHAINÉES Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes doublement chaînées A. Initialisation B. Insertion d'un élément dans la liste 1....
Listes circulaires (Ring Buffer) VoirListes circulaires Requis I. INTRODUCTION II. Définition III. La construction du prototype d'un élément de la liste IV. Opérations sur les listes circulaires A. Initialisation B. Insertion d'un élément dans la liste 1. Insertion dans...
Langage C - Les listes chaînées VoirLa notion de structure autoréferrentielle Une structure autoréferrentielle (parfois appelée structure récursive) correspond à une structure dont au moins un des champs contient un pointeur vers une structure de même type. De cette façon on crée...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...

1

 loupius, le 1 mar 2009 à 17:54:36

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.

Répondre à loupius