-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy path3_23.rkt
100 lines (76 loc) · 3.06 KB
/
3_23.rkt
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#lang sicp
#| Solution for exercise 3_23. |#
(#%require (only racket/base displayln display))
(#%provide make-deque empty-deque?
front-deque rear-deque
front-insert-deque! rear-insert-deque!
front-delete-deque! rear-delete-deque!
print-deque)
;; Nodes proc:
(define (make-node val)
(list val '() '()))
(define (value-node node)
(car node))
(define (next-node node)
(cadr node))
(define (set-next-node! node val)
(set-car! (cdr node) val))
(define (prev-node node)
(caddr node))
(define (set-prev-node! node val)
(set-car! (cddr node) val))
;; Deque helper proc:
(define (front-ptr deque) (car deque))
(define (rear-ptr deque) (cdr deque))
(define (set-front-ptr! deque item) (set-car! deque item))
(define (set-rear-ptr! deque item) (set-cdr! deque item))
(define (insert-first! deque node)
(set-front-ptr! deque node)
(set-rear-ptr! deque node))
(define (last-elm-dequeq? deque) (eq? (front-ptr deque) (rear-ptr deque)))
;; Main proc:
(define (make-deque)
(cons '() '()))
(define (empty-deque? deque) (eq? (front-ptr deque) '()))
(define (front-deque deque)
(if (empty-deque? deque)
(error "attempt to recive FRONT from empty deque")
(value-node (front-ptr deque))))
(define (rear-deque deque)
(if (empty-deque? deque)
(error "attempt to recive REAR from empty deque")
(value-node (rear-ptr deque))))
(define (front-insert-deque! deque val)
(let ((new-node (make-node val)))
(cond ((empty-deque? deque) (insert-first! deque new-node))
(else
(set-next-node! new-node (front-ptr deque))
(set-prev-node! (front-ptr deque) new-node)
(set-front-ptr! deque new-node)))))
(define (rear-insert-deque! deque val)
(let ((new-node (make-node val)))
(cond ((empty-deque? deque) (insert-first! deque new-node))
(else
(set-next-node! (rear-ptr deque) new-node)
(set-prev-node! new-node (rear-ptr deque))
(set-rear-ptr! deque new-node)))))
(define (front-delete-deque! deque)
(cond ((empty-deque? deque) (error "attempt to call front-delete-deque! on empty deque"))
((last-elm-dequeq? deque) (set-front-ptr! deque '()) (set-rear-ptr! deque '()))
(else
(set-front-ptr! deque (next-node (front-ptr deque)))
(set-prev-node! (front-ptr deque) '()))))
(define (rear-delete-deque! deque)
(cond ((empty-deque? deque) (error "attempt to call rear-delete-deque! on empty deque"))
((last-elm-dequeq? deque) (set-front-ptr! deque '()) (set-rear-ptr! deque '()))
(else
(set-rear-ptr! deque (prev-node (rear-ptr deque)))
(set-next-node! (rear-ptr deque) '()))))
(define (print-deque deque)
(define (helper-print node first)
(cond ((null? node) (displayln ""))
(first (display "Deque: ")(display (value-node node)) (helper-print (next-node node) false))
(else (display "<->") (display (value-node node)) (helper-print (next-node node) false))))
(if (empty-deque? deque)
(displayln "Empty queue.")
(helper-print (front-ptr deque) true)))