2009-11-15 4 views
4

Как создать связанный список для хранения моих данных в Ocaml? Я пытаюсь создать отдельный список, но у меня возникают проблемы с синтаксисом. Я просто хочу создать модуль, чтобы просто получить «a из связанного списка, вставить« a »или« delete »a.Связанный список Ocaml

У кого-нибудь есть идеи?

Спасибо, Фейсал Абид

+1

Это домашнее задание, если это возможно? Если это так, отметьте его как таковой. –

+0

Это не домашнее задание, просто чтение книги по структурам данных и попытка попытаться реализовать это в Ocaml. –

ответ

8

Как сказал aneccodeal, 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)));; 
4

Не OCaml уже есть списки как примитив? Я не делал SML с колледжа, но, кажется, я вспоминаю head и tail примитивов. Я вижу, что другие люди внедрили структуру данных с привязанным списком ссылок, хотя ... например, выведите Dustin's OCaml Linkedlist.

+0

hmm Позвольте мне проверить это (вещь Дастина). Спасибо –

5

OCaml имеет списки, построенные в:

Список целых чисел: [1; 2; 3; 4; 5] ;; возвращает: int list = [1; 2; 3; 4]

Список строк: ["this"; "that"; "other"] ;; возвращает: string list = ["this"; "что"; "Другой"]

Или вы можете использовать оператор минусы :: построить списки:

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

+0

Это, однако, относится к LinkedList, с узлами и т. Д.? –

+0

@Failsal: да. Хотя на самом деле это стек (структура данных построена из связанного списка), поэтому вы можете только выталкивать и выталкивать узлы из списка. – Juliet

+1

Только что добавил в конце моего ответа: вы можете посмотреть, как списки реализованы в стандартной библиотеке OCaml, просмотрев: [место установки для OCaml] /lib/ocaml/std-lib/list.ml – aneccodeal

Смежные вопросы