Cvičení 4. (8.3.) ----------------- Procvičování mutovatelných seznamů ---------------------------------- PŘ: (require compatibility/mlist) (define a (mlist 'a 'b 'c)) => (set-mcdr! a (mcdr (mcdr a))) a => ? (define b (mlist (mcons 1 2) (mcons 3 4) (mcons 5 '()))) => (set-mcdr! (mcar b) (mcdr b)) (set-mcdr! (mcar (mcdr b)) (mcdr (mcdr b))) b => ? (set-mcdr! ((mcdr (mcdr b)) b) b => ? (define d (mcons 'z b)) d => ? PŘ: Vymodelujte graf pomoci paru, hrany grafu jsou definovany takto: {, , , , } PŘ: (eq? '(1) '(1)) => ? (equal? '(1) '(1)) => ? (define a '(1)) (eq? a a) => ? (equal? a a) => ? (eqv? 3.0 3.0) => ? (eq? 3.0 3.0) => ? (member '(1 2) (1 (1 2) 3)) => ? (memq '(1 2) '(1 (1 2) 3)) => ? Úkol na hodině: --------------- Naprogramujte proceduru destructive-map - zmutuje seznam - nevytváří nový (destructive-map odd? (mlist 1 2 3 4 5)) => (#t #f #t #f #t) Naprogramujte proceduru destructive-filter, která vymaže prvky ze seznamu, které neprojdou testem - provede to mutací párů (destructive-filter odd? (mlist 1 2 3 4 5)) => (1 3 5) (define a (mlist 1 2 3 4 5)) (destructive-filter odd? a) a => (1 3 5) (set! a (destructive-filter even? a)) a => () Vylepšení: ---------- - předejte seznam boxem (define a (make-mbox (mlist 1 2 3 4 5 6))) (destructive-filter even? a) (a 'get) => (2 3 4 6) Naprogramujte proceduru cyclic?, vrátí #t, pokud se ve struktuře i hloubkově nachází zpětný/cyklický odkaz - na hodině případně DÚ (define a (mlist 'a 'b 'c)) (set-mcdr! a (mcdr (mcdr a))) (cyclic? a) => #f (set-mcdr! (mcdr (mcdr a)) (mcdr a)) (cyclic? a) => #t Domácí úkol: ------------ Objektově naprogramujte binární vyhledávácí strom Operace: 'insert, 'find, 'delete (volitelně) Operace 'insert a 'delete musejí být DESTRUKTIVNÍ (využívající set-mcar!, set-mcdr!)