Advertisement
Guest User

Untitled

a guest
Jan 19th, 2020
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.51 KB | None | 0 0
  1. type 'a elem = {v : 'a; mutable next : 'a lista; mutable prev : 'a lista}
  2. and 'a lista = 'a elem option;;
  3.  
  4. (* two_or_more dla danej niepustej listy wyciąga z niej drugi element (zwraca Some 'a) a pierwszy łączy z trzecim lub
  5. łączy z None dla listy krótszej niż trzyelementowej, jeżeli dana lista będzie jednoelementowa to funkcja zwroci None*)
  6. let two_or_more lst0 =
  7. match lst0 with
  8. | None -> failwith "Tak się nie stanie"
  9. | Some el1 ->
  10. match el1.next with
  11. | None -> (None, None)
  12. | Some el2 ->
  13. begin
  14. el1.next <- el2.next;
  15. match el2.next with
  16. | None -> (Some el2.v, None)
  17. | Some el3 ->
  18. begin
  19. el3.prev <- Some el1;
  20. (Some el2.v, Some el3)
  21. end
  22. end;;
  23.  
  24.  
  25. let codrugi lst0 =
  26. if lst0 = None then
  27. None
  28. else
  29. let (new_el_v, new_curr) = two_or_more lst0 in
  30. if new_el_v = None then
  31. None
  32. else
  33. let curr = ref new_curr in
  34. let lst2start = {v = new_el_v; next = None; prev = None} in
  35. let lst2 = ref lst2start in
  36. while !curr != None do
  37. begin
  38. let (new_el_v, new_curr) = two_or_more !curr in
  39. curr := new_curr;
  40. let new_el = {v = new_el_v; next = None; prev = Some !lst2} in
  41. match Some !lst2 with
  42. | None -> ()
  43. | Some lst2s -> lst2s.next <- Some new_el
  44. end
  45. done;
  46. Some lst2start;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement