Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- type 'a elem = {v : 'a; mutable next : 'a lista; mutable prev : 'a lista}
- and 'a lista = 'a elem option;;
- (* two_or_more dla danej niepustej listy wyciąga z niej drugi element (zwraca Some 'a) a pierwszy łączy z trzecim lub
- łączy z None dla listy krótszej niż trzyelementowej, jeżeli dana lista będzie jednoelementowa to funkcja zwroci None*)
- let two_or_more lst0 =
- match lst0 with
- | None -> failwith "Tak się nie stanie"
- | Some el1 ->
- match el1.next with
- | None -> (None, None)
- | Some el2 ->
- begin
- el1.next <- el2.next;
- match el2.next with
- | None -> (Some el2.v, None)
- | Some el3 ->
- begin
- el3.prev <- Some el1;
- (Some el2.v, Some el3)
- end
- end;;
- let codrugi lst0 =
- if lst0 = None then
- None
- else
- let (new_el_v, new_curr) = two_or_more lst0 in
- if new_el_v = None then
- None
- else
- let curr = ref new_curr in
- let lst2start = {v = new_el_v; next = None; prev = None} in
- let lst2 = ref lst2start in
- while !curr != None do
- begin
- let (new_el_v, new_curr) = two_or_more !curr in
- curr := new_curr;
- let new_el = {v = new_el_v; next = None; prev = Some !lst2} in
- match Some !lst2 with
- | None -> ()
- | Some lst2s -> lst2s.next <- Some new_el
- end
- done;
- Some lst2start;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement