【问题标题】:Linked List OCaml链表 OCaml
【发布时间】:2009-11-15 20:44:17
【问题描述】:

如何创建一个链表来保存 OCaml 中的数据?我正在尝试制作一个单链表,但是我遇到了语法问题。我只想制作一个模块来简单地从链表中获取'a,插入'a或删除'a。

有人知道吗?

【问题讨论】:

  • 这是作业吗?如果是这样,请标记它。
  • 不是真正的功课,只是读了一本关于数据结构的书,想尝试在Ocaml中实现。

标签: ocaml data-structures


【解决方案1】:

正如轶事所说,ocaml 已经有了列表。

但是,为了您的兴趣,您可以通过以下方式构建自己的列表。显然,你永远不会在真正的应用程序中使用它:) 如果你想要一些树,数据结构会非常相似。

exception Empty_list

type 'a my_list = Nil | List of 'a * 'a my_list

let head = function 
     Nil -> raise Empty_list
   | List(e,_) -> e;;

let tail = function
    Nil -> Nil
   | List(_,t) -> t

let l = List(1, List(4, List(8, Nil)));;

print_endline (string_of_int(head l));;

print_endline (string_of_int (head(tail l)));;

【讨论】:

    【解决方案2】:

    OCaml 内置了列表:

    整数列表: [1;2;3;4;5];; 返回: int list = [1; 2; 3; 4]

    字符串列表: [“这个”;“那个”;“其他”];; 返回:字符串列表 = ["this"; “那”; “其他”]

    或者您可以使用 cons 运算符 :: 来构建列表:

    1::2::3::[];; 返回: int list = [1; 2; 3]

    获取列表的头部(第一项):

    List.hd [1;2;3]
    返回 1

    获取列表的尾部(第一项之后的所有项)

    List.tl [1;2;3] 返回: int list = [2; 3]

    此外,您还可以通过以下方式了解列表在 OCaml 标准库中是如何实现的:

    [OCaml的安装位置]/lib/ocaml/std-lib/list.ml

    【讨论】:

    • 这是否符合 LinkedList 的条件,包含节点等?
    • @Failsal:是的。虽然它确实是一个栈(一个从链表构建的数据结构),所以你只能从链表的前面推送和弹出节点。
    • 刚刚在我的回答末尾添加了这个:您可以通过查看:[OCaml 的安装位置]/lib/ocaml/std- 来了解 OCaml 标准库中的列表是如何实现的lib/list.ml
    • @Juliet,不知道这很有趣!谢谢@annec 我现在就检查一下实现谢谢!
    【解决方案3】:

    OCaml 不是已经将列表作为原语吗?我从大学开始就没有做过 SML,但我似乎记得 headtail 原语。我看到其他人已经实现了一个真正的链表数据结构......例如查看Dustin's OCaml Linkedlist

    【讨论】:

    • 嗯,让我看看(达斯汀的事)。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多