http://deptinfo.unice.fr/~roy
COMPLEMENT DE COURS : DIFFERENCE ENTRE STRUCTURES ET LISTES
1. Comment une structure est-elle représentée en mémoire ? En première approximation, par un bloc compact contenant les
divers champs de la structure. Par exemple, une structure « colored-posn » ayant trois champs x, y [les coordonnées] et c [la
couleur] sera représentée par un bloc compact comme celui-ci :
2. Comment une liste est-elle représentée en mémoire ? Non pas sous la forme d’un bloc compact de données mais par un
ensemble de cellules dans la mémoire centrale de l’ordinateur, chacune étant reliée à la suivante par un « pointeur de
chaînage ». Ce pointeur n’est autre que l’adresse [numéro de la case mémoire] de la cellule suivante. Par exemple, la liste
(a!b!c d) pourra se présenter ainsi en mémoire :
Dans un tel schéma, chaque flèche représente un pointeur, c’est à dire l’adresse de la cellule suivante. La dernière cellule a un
pointeur de chaînage vide, représenté par une croix [la liste vide]. On voit alors bien ce que fait la fonction cons!: elle crée
une cellule à deux champs first et rest, où first est l’information portée par la cellule, et rest le pointeur de chaînage.
Et le résultat de cons! est un pointeur vers la cellule de tête ! Les cellules de listes sont ainsi éparpillées dans la mémoire de
l’ordinateur. La liste ci-dessus peut être définie sous l’une des deux formes équivalentes :
(define L (list ’a ’b ’c ’d))
(define L (cons ’a (cons ’b (cons ’c (cons ’d empty)))))
Exercice 7.1 Familiarisez-vous avec les chaînages :
a) Dessinez le chaînage en mémoire de la liste (a b (c d) e). Appelez votre enseignant pour vérifier.
b) Définissez une variable L dont la valeur soit cette liste. Quelle est la longueur de L ? Vérifiez votre réponse au toplevel.
c) Quelle est l’expression en fonction de L qui permet d’accéder à l’information c de cette liste ?
d) Si L1 = (1 2 3) et L2 = (a b c d), dessinez sur un même schéma les chaînages de L1, de L2 et de (append L1 L2).
TRAVAIL SUR LES LI S T E S
Exercice 7.2 a) Programmez une fonction (somme L) prenant une liste de nombres L, et retournant la somme de ces nombres.
(somme ’(6 3 1 8 2)) 20
b) En déduire une fonction (moyenne L) retournant la moyenne de la liste de nombres L :
(moyenne ’(6 3 1 8 2)) 4
Exercice 7.3 En utilisant la primitive build-list, programmez les fonctions suivantes :
a) La fonction (entiers n) prenant un entier n ≥ 0 et retournant la liste des entiers de [0,n]!:
(entiers 6) (0 1 2 3 4 5 6)
b) La fonction (impairs n) prenant un entier n ≥ 0 et retournant la liste des entiers impairs de [0,n]!:
(impairs 10) (1 3 5 7 9), (impairs 11) (1 3 5 7 9 11)
c) La fonction (intervalle a b) prenant deux entiers a ≤ b, et retournant les entiers de [a,b].
(intervalle 5 10) (5 6 7 8 9 10)
Exercice 7.4 Programmez