Bonsoir,
J'ai un petit souci dans une procédure, je vous présente le problème.
On travaille ici avec le type Liste des listes simplement chaînées de caractères défini par:
1 2 3 4 5 6 7
|
type Cellule;
type Liste is access Cellule ;
type Cellule is record
Val : Character ;
Suiv : Liste;
end record; |
On doit écrire une procédure Extrait, qui retire d'une liste L, une sous-liste correspondant à une certaine chaîne non vide S.
procedure Extrait(L: in out Liste ; S:String) ;
On utilisera la procédure:
1 2
|
procedure Liberer is new Ada.Unchecked_Deallocation(Cellule,Liste) ; |
Exemple:
On suppose L=[a,b,a,t,o,t,o,t,o,r,o]
Extrait(L,"totor");
L=[a,b,a,t,o,o]
Extrait(L,"oo");
L=[a,b,a,t]
Extrait(L,"aa");
L=[a,b,a,t]
Extrait(L,"a");
L=[b,a,t]
Extrait(L,"bat");
L=[]
Voilà à quoi j'ai pensé :
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
|
procedure Extrait(L: in out Liste ; S:String) is
Cour , Tete , Queue , Aux: Liste ;
B : Boolean;
K:Integer;
begin
Cour := L ;
Tete := null;
Queue := null;
B := True ;
K:=S'First;
while Cour /= null loop
Aux := Cour;
while Cour.Val = S(K) loop
if B then
Tete:=Cour;
B:=False;
end if;
if K/=S'Last then
if Cour.Suiv = null then
exit ;
end if;
K:=K+1;
Cour:=Cour.Suiv ;
else
Queue:=Cour;
exit;
end if;
end loop;
if Queue /= null then
Cour:=null;
else
Cour:=Aux.Suiv;
K:=S'First;
Tete:=null;
B:=True;
end if;
Liberer(Cour);
end loop;
if Queue /= null then
Cour := L;
while Cour.Suiv /= Tete loop
Cour := Cour.Suiv;
end loop;
if Queue.Suiv /= null then
Cour.Suiv := Queue.Suiv;
Queue.Suiv:=null;
else
if Tete /= L then
Cour.Suiv := null;
else
L:=null;
end if;
end if;
Liberer(Cour);
Liberer(Tete);
Liberer(Queue);
end if;
end; |
En fait, la tête et la queue c'est pour délimiter la chaîne de caractères si elle a été trouvée, pour l'éliminer après.
Merci d'avance.
Partager