930 likes | 1.04k Views
Algorithme et structure de données. IUP1 Miage. Structure de donnée composée. Une entité qui possède plusieurs attribut (ou champs) Exemple : Un individu à un nom , un prénom et un numéro Une voiture à une marque , une puissance , une valeur , …. Les Fractions.
E N D
Algorithme et structure de données IUP1 Miage
Structure de donnée composée Une entité qui possède plusieurs attribut (ou champs) Exemple : • Un individu à un nom, un prénom et un numéro • Une voiture à une marque, une puissance, une valeur, …
Les Fractions Une fraction a un numérateur et un dénominateur ; les attributs sont de type entier class Fraction { public int numerateur ; public int denominateur ; }
Comment accéder aux attributs ? class Fraction { public int numerateur; public int denominateur; } public class Test { … main(…){ Fraction f = new Fraction(); f.numerateur=13; f.denominateur=21; S.o.p(f.numerateur/f.denominateur); }
La classe Fraction les attributs sont de type entier, leur valeur initiale est un nombre entier aléatoire (non nul pour le dénominateur !) class Fraction { private final int Max=100; public int numerateur=(int) (Math.random()*Max); public int denominateur=(int) (Math.random()*(Max-1))+1; }
La classe Fraction Une fraction est capable de répondre au message toString() qui retourne une description de la fraction sous la forme d’une String "numerateur/denominateur=valeur " public String toString(){ return numerateur+"/"+denominateur+"="+numerateur/(double)denominateur; }
Comment ce servir da la classe Fraction ? public class Test { … main(…){ Fraction f = new Fraction(); S.o.p(f); } > java Test 13/26=0.5
Comment ce servir da la classe Fraction ? public class Test { … main(…){ Fraction f = new Fraction();S.o.p(f); f.numerateur = 6 ; f.denominateur = 2 ; S.o.p(f); } > java Test 71/22=3.227272727272727 6/2=3.0
Un tableau de Fractions … main(…){ Fraction[] tab=new Fraction[4] ; for(int i=0;i< tab.length;i++){ tab[i]=new Fraction(); S.o.p(tab[i]); } }
Structure de Liste chaînée • Un élément d’une liste possède un attribut valeur (de type entier) et un attribut suivant de type élément • C’est bien une définition récursive ! • Avantage : le nombre d’éléments est variable et les éléments sont créés (ou supprimés) à la demande pendant l’exécution
Élément d’une liste chaînée class Element { public int valeur ; public Elementsuivant ; }
Structure de Liste chaînée • Une liste possède un seul attribut tete de type Element qui représente le premier élément de la liste • Une Liste est initialement vide (la valeur de l’attribut tete est null) class Liste { public Element tete = null ; }
Construire une liste vide class Test { … main(…){ Liste l = new Liste() ; S.o.p(l); } } > java Test [ ]
Ajouter un nouvel élément en tête de la liste … main(…){ Liste l= new Liste(); S.o.p(l); Element e=new Element(); e.valeur=99;e.suivant=null ; l.tete=e; S.o.p(l); } > java Test [ ] [ 99 ]
Ajouter un nouvel élément en tête de la liste … main(…){ Liste l= new Liste(); S.o.p(l); Element e1 = new Element(); e1.valeur=99;e1.suivant=null ; l.tete=e1;S.o.p(l); Element e2 = new Element(); e2.valeur=100;e2.suivant=l.tete ; l.tete=e2;S.o.p(l); } > java Test [ ] [ 99 ] [ 100 99 ]
Ajouter un nouvel élément en tête de la liste … main(…){ Liste l= new Liste(); S.o.p(l); Element e1 = new Element(); e1.valeur=99;e1.suivant=null ; l.tete=e1;S.o.p(l); Element e2 = new Element(); e2.valeur=100;e2.suivant=l.tete ; l.tete=e2;S.o.p(l); Element e3 = new Element(); e3.valeur=101;e3.suivant=l.tete ; l.tete=e3;S.o.p(l); } > java Test [ ] [ 99 ] [ 100 99 ] [ 101 100 99 ]
Ajouter un nouvel élément en tête de la liste Ajouter un nouvel élément en tête de la liste … main(…){ Liste l= new Liste(); S.o.p(l); //l.tete=null Element e1 = new Element(); e1.valeur=99;e1.suivant=l.tete ; l.tete=e1;S.o.p(l); Element e2 = new Element(); e2.valeur=100;e2.suivant=l.tete ; l.tete=e2;S.o.p(l); } > java Test [ ] [ 99 ] [ 100 99 ]
voidajouterEnTete(Element e) • Méthode qui ajoute un nouvel élément en tête de la liste (celle qui reçoit le message) class Liste { public Element tete = null ; void ajouterEnTete(Element e){ e.suivant=this.tete ; this.tete=e; } }
Créer une liste de 10 éléments … class Element { public int valeur = (int) (Math.random()*100); public Element suivant ; } class Test { … main(…) { Liste l= new Liste() ; S.o.p(l); for(int i=0; i<10 ; i++) l.ajouterEnTete(new Element()) ; S.o.p(l); } } > java Test [ ] [ 65 32 66 33 55 51 12 36 11 83 ]
String toString() Méthode qui retourne une description de la liste (celle qui reçoit le message) sous la forme d’une String "[valeurDeTete..valeurDeQueue]" class Test { … main(…) { Liste l = new Liste() ; for(int i=0;i<10;i++) l.ajouterEnTete(new Element()) ; S.o.p(l); S.o.p(l.toString()); } }
String toString() class Liste { public Element tete = null ; String toString(){ String s="[ "; for(Element p=tete;p!=null;p=p.suivant) s+=p.valeur+" "; return s+="]"; } }
Recherche dans une liste class Test { … main(…) { Liste l= new Liste() ; for(int i=0;i<10;i++) l.ajouterEnTete(new Element()); S.o.p("20 in " + l + " is " + l.estDans(20)); } } > java Test 20 in [ 49 34 3 49 56 37 73 67 82 99 ] is false > java test 20 in [ 16 20 84 5 97 24 26 18 58 84 ] is true
Recherche dans une liste boolean estDans(int x) { Element p=tete; while (p != null && p.valeur != x) p = p.suivant; return !(p == null) ; }
Retirer le premier élément class Test { … main(…){ Liste l= new Liste() ; for(int i=0;i<10;i++){ l.ajouterEnTete(new Element()); } S.o.p(l);l.retirerEnTete();S.o.p(l); } } > java Test [ 33 74 44 73 20 29 47 51 11 36 ] [ 74 44 73 20 29 47 51 11 36 ]
Retirer le premier élément void retirerEnTete(){ if (! listeVide()) tete=tete.suivant; }
Suppression de la première occurrence class Test { … main(…){ Liste l= new Liste() ; for(int i=0;i<10;i++) { l.ajouterEnTete(new Element()); } S.o.p(l); l.supprimer(20) ; S.o.p(l); } } > java Test [ 48 71 76 3 13 72 85 0 56 90 ] [ 48 71 76 3 13 72 85 0 56 90 ] > java Test [ 37 7 20 26 6 5 57 80 0 87 ] [ 37 7 26 6 5 57 80 0 87 ]
Suppression de la première occurrence de v void supprimer(int v){ Element p=tete; if (tete != null){ if (tete.valeur==v) { retirerEnTete();} else { while (p.suiv!=null && p.suiv.valeur!=v) p=p.suiv; if (p.suiv!=null) p.suiv=p.suiv.suiv; } } }
Retirer le dernier élément class Test { … main(…){ Liste l= new Liste() ; for(int i=0;i<10;i++){ l.ajouterEnTete(new Element()); } S.o.p(l);l.retirerEnQueue();S.o.p(l); } } > java Test [ 33 74 44 73 20 29 47 51 11 36 ] [ 33 74 44 73 20 29 47 51 11 ]
Retirer le dernier élément void retirerEnQueue(){ if (! listeVide()) if (tete.suivant==null) // un seul element tete=null; else{ // au moins deux elements Element p=tete; while (p.suivant.suivant!=null) p=p.suivant; p.suivant=null; } }
Ajouter en queue class Test { … main(…){ Liste l= new Liste() ; for(int i=0;i<10;i++) { l.ajouterEnTete(new Element()); } S.o.p(l); l.ajouterEnQueue(new Element()); S.o.p(l); } } > java Test [ 96 21 38 79 99 6 67 4 78 45 ] [ 96 21 38 79 99 6 67 4 78 45 33 ]
Ajouter en queue void ajouterEnQueue(Element e){ Element p=tete; if (listeVide()) { e.suivant=this.tete ; this.tete=e; } else { // au moins un element while (p.suivant!=null) p=p.suivant; p.suivant=e; e.suivant=null; } }
Insertion d'un élément dans la liste en maintenant l'ordre croissant class Test { … main(…){ Liste l= new Liste() ; for(int i=0;i<10;i++) l.inserer(new Element()); S.o.p(l); } } > java Test [ 0 20 38 39 41 58 63 79 92 92 ] > java Test [ 3 14 33 36 46 52 62 70 71 73 ]
Insertion d'un élément dans la liste en maintenant l'ordre croissant void inserer(Element nouveau) { int v= nouveau.valeur ; if (tete == null || tete.valeur > v) { nouveau.suivant = tete ; tete = nouveau; } else { // On recherche la position ou insérer la valeur Element precurseur = tete; Element curseur = tete.suivant; while(curseur != null && curseur.valeur < v) { precurseur = curseur ; curseur = curseur.suivant; } precurseur.suivant = nouveau ; nouveau.suivant = curseur; } }
La classe Personne Une personne possède : • un attribut numero (de type int) • un attribut nom (de type String) • un attribut suivant (de type Personne)
La classe Personne class Personne { public int numero ; public String nom ; public Personne suivant ; public String toString(){ return "("+numero+","+nom+")"; } }
La classe ListeDePersonnes class ListeDePersonnes { public Personne tete = null ; public String toString(){ String s="[ "; for(Personne p=tete;p!=null;p=p.suivant) s+=p.toString()+" "; return s+="]"; } }
Liste de Personnes triée sur le numéro On suppose que la liste est triée par ordre croissant des numéros de personne void inserer(Personne p) Méthode qui ajoute un nouvel élément p dans la liste (celle qui reçoit ce message) en conservant l’ordre des numéros
Liste de Personnes triée sur le numéro class Test { … main(…){ ListeDePersonnes l = new ListeDePersonnes(); Personne p ; for(int i=0; i<5 ; i++) { p=new Personne(); p.numero=(int) (Math.random()*100); p.nom=Console.readLine("Le Nom ?"); l.inserer(p); } S.o.p(l); } } > java Test [ (17,tutu) (22,toto) (39,titi) (45,tete) (95,tata) ]
void inserer(Personne nouveau) void inserer(Personne nouveau) { int v= nouveau.numero ; // On teste si la liste est vide if (tete == null || tete.numero > v) { nouveau.suivant = tete ; tete = nouveau; } else { // On recherche la position ou insérer la valeur Personne precurseur = tete; Personne curseur = tete.suivant; while(curseur != null && curseur.numero < v) { precurseur = curseur; curseur = curseur.suivant; } precurseur.suivant = nouveau; nouveau.suivant = curseur; } }
Liste de Personnes triée sur le nom On suppose que la liste est triée par ordre croissant des noms de personne void inserer2(Personne p) Méthode qui ajoute un nouvel élément p dans la liste (celle qui reçoit ce message) en conservant l’ordre des noms
void inserer2(Personne nouveau) void inserer2(Personne nouveau) { String v = nouveau.nom ; if (tete == null || tete.nom.compareTo(v)>0) { nouveau.suivant = tete; tete = nouveau; } else { // On recherche la position ou insérer la valeur Personne precurseur = tete; Personne curseur = tete.suivant; while(curseur != null && curseur.nom.compareTo(v)<0) { precurseur = curseur; curseur = curseur.suivant; } precurseur.suivant = nouveau; nouveau.suivant = curseur; } }
Liste chaînée circulaire • On suppose qu’il existe au moins un élément • Le dernier « pointe » sur le premier • Comment détecter le dernier élément ?
Créer une liste circulaire e tete
Créer (construire) une liste circulaire class ListeCirculaire { public Element tete ; public ListeCirculaire(){ Element e = new Element(); tete = e ; e.suivant = tete ; } }
Créer (construire) une liste circulaire class Test { … void main(…){ ListeCirculaire lc=new ListeCirculaire(); S.o.p(lc); } } > java Test [ 83 ]
void ajouterEnTete(Element e) class Test { … void main(…){ ListeCirculaire lc=new ListeCirculaire(); for(int i=0; i<5 ; i++) lc.ajouterEnTete(new Element()); S.o.p(lc); } } > java Test [ 68 61 26 12 92 94 ]
void ajouterEnTete(Element e) class ListeCirculaire { public Element tete ; public ListeCirculaire(){…} public Element dernierElement(){ Element p=tete;while(p.suivant!=tete) p=p.suivant; return p; } public void ajouterEnTete(Element e){ Element d=this.dernierElement(); e.suivant=this.tete ; this.tete=e; d.suivant=tete; }