-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy path01graph.scm
47 lines (38 loc) · 1.55 KB
/
01graph.scm
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
(load "../../lib/scm/unit.scm")
(load "../08/03filter.scm")
; Добавя (k v) в асоциативния списък a, ползвайки set-cdr!.
(define (insert! k v a)
(set-cdr! a
(cons (list k v)
(cdr a))))
; Създава граф по списък от върхове. Налага се да вземаме списъка от върхове
; тъй като не можем да създадем истински празен граф - ако той е празен списък,
; деструктивните операции няма да могат да го „напълнят“ със съдържание, тъй
; като insert! (респективно set-cdr!) няма как да добавя в празен списък.
(define (create-graph vertices)
(map (lambda (v)
(list v '()))
vertices))
(define (add-vertex! v g)
(insert! v '() g))
(define (add-edge! a b g)
(let ((start-vertex (assoc a g)))
(set-cdr! start-vertex
(list (cons b (cadr start-vertex))))))
(define (vertices g)
(map car g))
(define (neighbours v g)
(cadr (assoc v g)))
(define g1 (create-graph '(5 7)))
(add-vertex! 1 g1)
(add-vertex! 2 g1)
(add-vertex! 4 g1)
(assert-equal '((5 ()) (4 ()) (2 ()) (1 ()) (7 ())) g1)
(assert-equal '(5 4 2 1 7) (vertices g1))
(assert-equal '() (neighbours 2 g1))
(add-edge! 1 2 g1)
(add-edge! 1 4 g1)
(add-edge! 5 2 g1)
(assert-equal '((5 (2)) (4 ()) (2 ()) (1 (4 2)) (7 ())) g1)
(define g2 '((4 (1 2)) (5 (1 2 3))))
(assert-equal '(1 2 3) (neighbours 5 g2))