Explorer les Livres électroniques
Catégories
Explorer les Livres audio
Catégories
Explorer les Magazines
Catégories
Explorer les Documents
Catégories
Exemple :
M = {1,2,3,3,1,1,4,1,5,5,6}
est un multi ensemble d’entiers.
On s’intéresse dans cet exercice aux multi ensembles sur les entiers.
On peut représenter un multi ensemble par une liste chaînée simple définie par :
R1 = ^ nœud
nœud = enreg
val : entier
suiv : R1
fenreg
1) Ecrire une fonction qui étant donné un multi ensemble d’entiers M représenté selon R1 et
un entier X calcule la fréquence (le nombre d’apparitions) de X dans M.
2) Proposer une autre représentation R2 des multi ensembles sur les entiers, basée sur les
listes chaînées et évitant les redondances d’éléments.
R2 = ^ nœud2
nœud2 = enreg
val : entier
nb_occ : entier // nombre d’apparition
suiv : R2
fenreg
3) Ecrire une procédure qui étant donné un multi ensemble d’entiers représenté selon R1
fournira le même multi ensemble représenté selon R2.
De_R1_Vers_R2(L1 :R1 ; var L2 : R2)
Var p : R1
q : R2
Debut
L2 := NIL
p := L
Tant que p < > NIL faire
q := existe(L2,p^.val)
si q ≠ NIL
alors q^.nb_occ := q^.nb_occ + 1
sinon créer(q)
q^.val := p^.val
q^.nb_occ := 1
q^.suiv := L2
L2 := q
fsi
p := p ^. suiv
fait
Fin
Exercice 2 :
On considère une liste chaînée circulaire d'entiers de la forme suivante : L
4 10 7 12
Dans une telle liste, le pointeur L permet d'accéder au dernier nœud de la liste (au lieu du
premier). Cette organisation simplifie les insertions en tête et en queue. On remarque que la
tête de la liste (le noeud contenant 4) est accédée par le champ next du dernier nœud (le nœud
contenant 12).
1) Ecrire une fonction qui calcule le nombre de nœuds d’une telle liste.
Exercice 3 :
On s’intéresse à la fusion de listes ordonnées. On est en présence de k suites de nombres
ordonnées de façon décroissante, et on veut les fusionner en une seule suite croissante.
A chaque étape, on considère le premier élément de chacune des k listes (c'est le plus grand
dans chaque liste). Le maximum de ces nombres est inséré dans la liste résultat, et supprimé
de la liste dont il provient. On répète ce processus jusqu’à ce que toutes les listes soient vides.
Pour ce faire, on stocke les adresses des têtes de listes (k adresses) dans un tableau de taille
maximale MAX (Figure 1). Quand une liste devient vide l’élément correspondant dans le
tableau y sera supprimé.
2) Ecrire une fonction qui retourne l’indice, dans le tableau, de la liste contenant le plus
grand élément. Pour l’exemple de la Figure 1, la fonction retournera la valeur 3.
1 2 3 4 5 6 7
80 60 90 40 57 15 85
70 30 20 39 46 10 66
NIL NIL
50 25 3 8
NIL
35 23 1
NIL
28 12
NIL
19
NIL
3) Ecrire une procédure qui supprime le plus grand élément de la liste dont il provient. Si
la liste devient vide, on la supprimera du tableau.
Supp_plus_gd ( var T : TAB_LISTE ; var k : entier ) : entier
Var pos : entier
Debut
pos := Pos_plus_gd ( T , k )
Supp_plus_gd := T[pos]^.val
supprime_tête( T[pos] )
Si T[pos] = NIL
Alors T[pos] := T[k]
K := k-1
Fsi
Fin
4) Ecrire une procédure qui construit une liste ordonnée dans un ordre croissant à partir
de k listes ordonnées de façon décroissante et représentées par un tableau de type
TAB_LISTE.