Liste simplement chainée en poo

Soyez le premier à donner votre avis sur cette source.

Snippet vu 9 027 fois - Téléchargée 31 fois

Contenu du snippet

Manipuler les fonctions de base d'une liste simplement chainée avec la POO en C++

Source / Exemple :


//------NOEUD.H
#include<iostream.h>
class noeud{
	int val;
	noeud* suiv;
public:
	noeud(int,noeud* =NULL );	//espace necessaire entre * et =
	~noeud() {};
	noeud(const noeud &);
    int get_val();    
	void set_val(int x);
	noeud* get_suiv();
	void set_suiv(noeud*);                   
};

//-----NOEUD.CPP
#include "noeud.h"
#include<stdlib.h>
#include<iostream.h>

noeud::noeud(int x,noeud* s):val(x),suiv(s){}

int noeud::get_val(){ return val;}

noeud* noeud::get_suiv(){return suiv;}	//Pour lire seulement

void noeud::set_suiv(noeud* s){suiv=s;}	//Pour la modification*/

noeud::noeud(const noeud & n):val(n.val),suiv(n.suiv){}

//------LISTE.H
#include"noeud.h"
#include<iostream.h>

class liste{
	noeud* tete;
public:
	liste(){tete=NULL;}
	~liste();
	liste(const liste &);
	void insert(int x);
	noeud* rech_pos(int);
	bool supprimer(int);
	void afficher();
};

//-------LISTE.CPP
#include "liste.h"
#include<stdlib.h>
#include<iostream.h>
#include<malloc.h>
//---------------------Constructeur par recopie---------------
liste::liste(const liste& l){
	noeud* parcl;
	noeud* parc;
	if(l.tete==NULL)tete=NULL;
	else

	{
		tete= new noeud (l.tete ->get_val());
		parcl=l.tete ->get_suiv();
		parc=tete;

     while(parcl!=NULL)
	 {
		 int x=parcl->get_val();
		 noeud* nouv=new noeud (x);
		 parc->set_suiv(nouv);//jusqu'a ici(3.1° ligne)->-----par:parc->set_suiv(new noeud(parcl->get_val());
		 parc=parc->get_suiv();
		 parcl=parcl->get_suiv();
	 }
	}
}
//---------------------Destructeur--------------------------------
liste::~liste(){
	noeud* parc=tete;
	while(parc!=NULL){
		noeud* prec=parc ;
		parc=parc->get_suiv();
		delete parc;
	}
}
//----------------------Insrtion----------------------------------
void liste::insert(int x)
{
	 noeud* nouv=new noeud(x);
	 nouv->set_suiv(tete);
	 tete=nouv;
	 //tete=new noeud(x,tete);
}

//----------------------Afficher la liste--------------------------
void liste::afficher(){
	noeud* parc=tete;
	cout.width(10);cout<<"LISTE:(";
	while(parc!=NULL){
		cout<<parc->get_val()<<",";
		parc=parc->get_suiv();
	}
	cout<<")\n";
}

//--------------------Rechercher la position du x-----------------
noeud* liste::rech_pos(int x){
	if(tete==NULL)return NULL;
	noeud* parc=tete;
	noeud* prec;
	while(parc!=NULL&&parc->get_val()!=x){
		prec=parc;
		parc=parc->get_suiv();}
	if(parc==NULL)return NULL;//x n'xiste pas
	return(prec);
}

//---------------------Supprition d'un élèment---------------------
bool liste::supprimer(int x){
	if(rech_pos(x)==NULL)return false;
	noeud* pos_rech;
	noeud* prec;
	noeud* p_suiv;
	//Si x dans la tete
	if(x==tete->get_val()){pos_rech=tete;
						  tete=pos_rech->get_suiv();
						  delete pos_rech;
						  return true;
						} 
	prec=rech_pos(x);
	pos_rech=prec->get_suiv();
	p_suiv=pos_rech->get_suiv();
	delete pos_rech;
	prec->set_suiv(p_suiv);
	return true;
}

//----PROGRAMME_PRICIPALE.CPP
#include "liste.h"
#include<iostream.h>
#include<stdlib.h>
void main(){
	liste l1;
	int x;
	cout.width(55);cout<<"-------------------------------------------\n";
	cout.width(45);cout<<"Cree par: JEBALI ALA EDDINE"<<endl;
	cout.width(55);cout<<"-------------------------------------------\n";
	cout<<"Nombre des noeud du liste:";
	int n;cin>>n;
	for(int i=0;i<n;i++){
		cout<<"\nRemplir:";cin>>x;
		l1.insert(x);
	}
	l1.afficher();
	cout<<"Suprimer:";
	cin>>x;
	if(!l1.supprimer(x))cout<<x<<" n'existe pas dans la liste\n";
	l1.afficher();
}

A voir également

Ajouter un commentaire Commentaires
Messages postés
1
Date d'inscription
jeudi 16 novembre 2000
Statut
Membre
Dernière intervention
26 décembre 2005

Salut, je viens de regarder ton source et j'y ai vu pas mal d'erreur (dsl!)

- Tout d'abord tu devrais terminer ta forme canonique pour chacune de tes classes, en effet il manque à chaque fois la surcharge de l'opérateur '=' qui permet de faire par exemple "liste1=liste2".

-Ensuite plutot que de faire une méthode afficher tu devrais simplement faire une surcharge de l'opérateur '<<'.
En voici la définition:
ostream& operator<< (ostream&, const liste&);

-Un plus serait aussi de comparer, lors d'une construction par copie, la liste ou le noeud qui est passé en paramètre avec soi même. A quoi bon se recopier soi même?
if(this!=&l)...faire la copie

-Ensuite je dirai que ton destructeur ne marche tout simplement pas! Tu t'es trompé dans le delete, il faut que tu delete prec au lieu de parc! Sinon comment veux tu acceder aux suivants?

-Lors d'une insertion tu utilises deux pointeurs afin de pouvoir garder l'adresse (dans prec) de l'élément que tu devras renvoyer. Mais pourquoi ne pas utiliser un "superpointeur" (appelation locale de mes anciens profs) au lieu de deux pointeurs? Je m'explique il vaut mieux un "noeud **parc" plutot que deux pointeurs. "Parc" sera alors un pointeur de pointeur! Voilà donc ce que cela donnerait

noeud* liste::rech_pos(int x){
if(tete==NULL)return NULL;
noeud** parc=&tete;
while(*parc!=NULL && (*parc)->get_val()!=x){
parc=&((*parc)->get_suiv());}
return(*parc);
}

-Enfin dans ta suppression tu fais appel deux fois à ta méthode rech_pos ce qui impose de parcourir deux fois ta liste et sur un million d'élément c'est long!

noeud *prec=rech_pos(x);
if(prec==NULL)return false;

Mais il vaut mieux utiliser un "superpointeur" et on voit d'ailleurs dans un tel cas toute son utilité:

bool liste::supprimer(int x){
noeud** parc=&tete;
while(*parc!=NULL && (*parc)->get_val()!=x){
parc=&((*parc)->get_suiv());}
if(*parc==NULL)
return false;

noeud *temp=*parc;
*parc=(*parc)->get_suiv(); //raccord
delete temp;
return true;
}


Bon voilà si tu as des questions n'hésites pas!
Bon code
Messages postés
15
Date d'inscription
samedi 31 juillet 2004
Statut
Membre
Dernière intervention
5 octobre 2009

Salut
Moi je suis un ami de EMSIEN et j'ai remarquer la même chôse que lui
et je trouve que c'est un travaille que lorsque tu términe tu publie directement
ça c'est trés bien et on veux bien partager avec toi cette experiense
si tu a besion de quelque chôse voila mon e_mail:
malki_abdelilah@hotmail.com
Messages postés
194
Date d'inscription
lundi 26 juillet 2004
Statut
Membre
Dernière intervention
11 juin 2009

Salut,
Si je ne me trmope pas (pusique à la même période dans deux lieux différents et avec les memes class c'est bizarre un peu),il s'agit d'un TP en c++ Que tu postes par là?
Puisque je travaille sur le même truc au niveau d'un TP,j'ai pas encore examiné ton Code mais je te laisse mon e-mail au cas t'as besoin de causer Objet.
shkaff_school at hotmail point com
http://ntic.blogspirit.com

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.