SICP第三章中表格的实现

本文介绍了如何在一维和两维表格中实现记录,使用序对连接记录并创建带表头单元的表。lookup过程用于根据关键码获取关联值,而insert!过程则实现了在特定关键码下插入值的功能。此外,还涉及了构建新表格的方法。
摘要由CSDN通过智能技术生成

一维表格
将这种表格实现为一个记录的表,其中每个记录将实现为由一个关键码和一个关联值组成的序对
将这种记录连接起来构成一个序对的表,让这些序对的car指针顺序指向各个记录。
为了使表格里加入记录时能有一个可以修改的位置,我们将构造一种带表头单元的表。带表头单元的表在开始处有一个特殊的骨架序对,其中保存着一个哑“记录”

lookup过程从表格里提取信息,以一个关键码为参数,返回与之关联的值或者假。

(define (lookup key table)
  (let ((record (assoc key (cdr table))))  ;(cdr table)跳过了哑记录
    (if record
        (cdr record)
        false)))
(define (assoc key records)
  (cond ((null? records) false)
        ((equal? key (caar records)) (car records))
        (else (assoc key (cdr records)))))

insert!过程在一个表格里的某个特定的关键码下插入一个值

(define (insert! key value table)
  (let ((record (assoc key (cdr table))))
    (if record
        (set-cdr! record value)
        (ser-cdr! table
                  (cons (cons key value) (cdr table)))))
  'ok)

构建一个新表格

(define (make-table)
  (list '*table*))

两维表格
每个值由两个关键码索引。

(define (assoc key records)
  (cond ((null? records) false)
        ((equal? key (caar records)) (car records))
        (else (assoc key (cdr records)))))

(define (lookup key-1 key-2 table)
  (let ((subtable (assoc key-1 (cdr table))))
    (if subtable
        (let ((record (assoc key-2 (cdr subtable))))
          (if record (cdr record) false))
        false)))

(define (insert! key-1 key-2 value table)
  (let ((subtable (assoc key-1 (cdr table))))
    (if subtable
        (let ((record (assoc key-2 (cdr subtable))))
          (if record (set-cdr! record value) (set-cdr! subtable (cons (cons key-2 value) (cdr subtable)))))
        (set-cdr! table
                  (cons (list key-1 (cons key-2 value)) (cdr table)))))
  'ok)

(define (make-table)
  (list '*table*))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值