-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathListeChainee.java
169 lines (140 loc) · 3.23 KB
/
ListeChainee.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/**
* Classe qui modelise une liste chainee sous la forme d'un tableau de maillons
* - chaque maillon represente un element de la liste
* - le successeur est stocke explicitement dans chaque maillon
*
* L'entier -1 designe la fin de liste, nil
*
* Les places libres sont caracterisees par le fait que le successeur vaut -2
*
*/
public class ListeChainee implements Liste {
/**
* attributs de gestion de la liste
*/
private int tete;
private MaillonChaine[] tab;
/**
* constructeur
* @param taillemax de la liste
*/
public ListeChainee(int tMax) {
// cree les tableaux
this.tab = new MaillonChaine[tMax];
// la liste est vide
this.tete = -1;
// initialise les cases en creant les objets
// successeur a -2
for (int i = 0; i < tMax; i++) {
this.tab[i]=new MaillonChaine(null, -2);
}
}
/**
* acces a la tete
*/
@Override
public int tete() {
return this.tete;
}
/**
* savoir si une place est en fin
* si la place vaut nil
*/
@Override
public boolean finliste(int p) {
return p == -1;
}
/**
* la successeur de maniere chainee, trouve dans le tableau suivant
*/
@Override
public int suc(int p) {
return this.tab[p].getSuc();
}
/**
* valeur trouvee dans le tableau valeur
*/
@Override
public String val(int p) {
return this.tab[p].getVal();
}
/**
* suppression d'un element de la liste
* avec gestion de la liste libre
*/
@Override
public void suplis(int p) {
// si la place est la tete
MaillonChaine courant = this.tab[p];
if (p == this.tete) {
//on decale la tete
this.tete = courant.getSuc();
//on libere la place
this.libererPlace(p);
} else {
int place = this.tete;
// trouver le precedent
while (this.tab[place].getSuc() != p) {
place = this.tab[place].getSuc();
}
this.tab[place].setSuc(courant.getSuc());
this.libererPlace(p);
}
}
/**
* permet de liberer une place en l'ajoutant a la liste des places libres
* @param p place a liberer
*/
private void libererPlace(int p) {
//fait le lien
this.tab[p].setSuc(-2);
}
/**
* ajout en tete avec gestion place libres
*/
@Override
public void adjtlis(String s) {
int libre = retournerPlaceLibre();
//on decale la place libre vers l'ancienne tete
this.tab[libre].setSuc(this.tete);
//on met a jour la tete
this.tete = libre;
//on ajute la valeur dans la nouvelle tete
this.tab[this.tete].setVal(s);
}
/**
* ajout avec gestion place libres
*/
@Override
public void adjlis(int p, String s) {
int libre=this.retournerPlaceLibre();
this.tab[libre].setSuc(this.tab[p].getSuc());
this.tab[libre].setVal(s);
this.tab[p].setSuc(libre);
}
/**
* permet de recuperer une place libre
* @return la tete de la liste libre et met a jour la liste libre
*/
public int retournerPlaceLibre() {
int placeCourante = 0;
//si la place est libre
while (this.tab[placeCourante].getSuc()!=-2)
{
placeCourante++;
}
return (placeCourante);
}
public String toString()
{
String s="*******************\n* contenu liste CHAINEE *\n*******************\n";
int place=this.tete;
while(place!=-1)
{
s+=this.tab[place].getVal()+"\n";
place=this.tab[place].getSuc();
}
s+="*******************";
return(s);
}
}