Bonjour à tous,
Je cherche à concevoir une fonction qui modifierait directement une liste pour en trier les différents éléments à partir du cdr de chacun.
Concrètement ma liste ressemblerait à ((elt1 . 15) (elt2 . 3) (elt3 . 10) (elt4 . 25) (elt5 . 8)) et je veux obtenir ((elt2 . 3) (elt5 . 8) (elt3 . 10) etc.)
J'ai utilisé le tri de l'arbre et fait ceci en tâchant de respecter au maximum les contraintes, mais j'ai toujours le sentiment que ce n'est pas la meilleure solution. Je ne serais pas contre quelques avis ou autres solutions qui n'utiliseraient que les types de branchement et fonctions déjà utilisées ici.
Je vous remercie d'avance de votre patience.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 (defun tri-liste (liste) (setq arbre (list (car liste))) (setq arbre (arbrifie (cdr liste) arbre)) (rplaca liste nil) (rplacd liste (cdr (lis-arbre arbre))) (nettoie-NIL liste)) (defun lis-arbre (arbre) (cond ((atom arbre) (list arbre)) (t (append (lis-arbre (cadr arbre)) (list (car arbre)) (lis-arbre (caddr arbre)))))) (defun arbrifie (liste arbre) (cond ((atom liste) arbre) ((arbrifie (cdr liste) (ajoute (car liste) arbre))))) (defun ajoute (element arbre) (cond ((atom arbre) (list element)) ((>= (cdr element) (cdar arbre)) (list (car arbre) (cadr arbre) (ajoute element (caddr arbre)))) (t (list (car arbre) (ajoute element (cadr arbre)) (caddr arbre))))) (defun nettoie-NIL (liste) (cond ((atom liste) nil) ((eq (car liste) nil) (nettoie-NIL (cdr liste))) (t (cons (car liste) (nettoie-NIL (cdr liste))))))
Partager