Gå til innhold

Enkel kø i scheme, greier ikke å slette siste element.


Anbefalte innlegg

Hei, har et spørsmål, men ikke et problem lenger. Jeg har lagd en enkel kø. Og den ville ikke slette siste elementet i køen.

 

Jeg lagrer pekerene til første og siste element i køen i et pair. Dersom jeg skal slette første element og pekerne til første og siste element er like, så skrev jeg over pairet med (cond '() '()), altså sånn en tom kø.

 

Koden ser sånn her ut:

(define (make-queue)
 (let ((data (cons '() '())))
(lambda (proc)
  (proc data))))

(define (remove-queue-item! queue)
 (queue (lambda (data)
	   (cond ((eq? (car data)
				   (cdr data))
			  (set! data (cons '() '())))
			 (else
			  (set-car! data (cdr (car data))))))))

 

Dette fungerte ikke, siden den ikke ville slette det siste elementet. Så jeg endret til:

 

(define (remove-queue-item! queue)
 (queue (lambda (data)
	   (cond ((eq? (car data)
				   (cdr data))
			  (set-car! data '())
			  (set-cdr! data '()))
			 (else
			  (set-car! data (cdr (car data))))))))

 

Og det fungerte helt fint. Kan noen fortelle meg hvorfor dette fungerer annerledes? Hvorfor fungerte det ikke å overskrive køen?

 

Nå ser jeg jo at løsningen ikke er så bra, siden den feiler dersom man legger samme objekt inn to ganger, men uansett... (Endret skjekken til (null? (cdr (car data)))).

 

Takker for svar.

 

Hele koden:

Klikk for å se/fjerne innholdet nedenfor
(define (make-queue)
 (let ((data (cons '() '())))
(lambda (proc)
  (proc data))))

(define (empty-queue? queue)
 (queue (lambda (data)
	   (null? (car data)))))

(define (add-to-queue! obj queue)
 (queue (lambda (data)
	   (let ((new-item (cons obj '())))
		 (cond ((null? (car data)) (set-car! data new-item)
								   (set-cdr! data new-item))
			   (else (set-cdr! (cdr data) new-item)
					 (set-cdr! data new-item)))))))

(define (first-queue-item queue)
 (queue (lambda (data)
	   (car data))))

(define (remove-queue-item! queue)
 (queue (lambda (data)
	   (cond ((eq? (car data)
				   (cdr data))
			  (set-car! data '())
			  (set-cdr! data '()))
			 (else
			  (set-car! data (cdr (car data))))))))

Endret av Blackslash
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...