Advertisement
PearlyXD

zad1

Jan 13th, 2021
2,859
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
OCaml 1.34 KB | None | 0 0
  1. let poodwracaj d lst =
  2.   let temp = ref None in (* zmienna pomocnicza do zamiany wskaźników *)
  3.   let rec kth k d = (* k-ty element z listy d *)
  4.     if k = 0 then d
  5.     else kth (k - 1) d.next
  6.   in
  7.   (* zamienia wszystko między d1 i d2 *)
  8.   let rec zamien d1 d2 =
  9.     (* jeżeli mamy zamienić d1 z samym sobą, to zamieniamy jego wskaźnik *)
  10.     (* następujący z poprzedzającym *)
  11.     if d1 = d2 then
  12.       begin
  13.         temp := d1.next;
  14.         d1.next <- d1.prev;
  15.         d1.prev <- temp
  16.       end
  17.     else
  18.       begin
  19.         let d1p = d1.prev
  20.         and d1n = d1.next
  21.         and d2p = d2.prev
  22.         and d2n = d2.next in
  23.         begin
  24.           (* zamieniamy wskaźniki z d1 na wskaźniki z d2 i vice versa*)
  25.           d1.next <- d2n;
  26.           d1.prev <- d2p;
  27.           d2.next <- d1n;
  28.           d2.prev <- d1p;
  29.           (* rekurencyjnie zamieniamy wskaźniki w drzewie poprzedzającym d2 i następującym d1 *)
  30.           zamien d1n d2p
  31.         end
  32.       end
  33.   in
  34.   let rec pom lst d =
  35.     match lst with
  36.     | [] -> ()
  37.     | h::t ->
  38.       let kon = kth h d in (* ostatni element, który będziemy zamieniać *)
  39.       let nxt = kon.next in
  40.       begin
  41.         zamien d kon; (* zamień elementy od d do kon *)
  42.         pom t nxt (* zrób to samo dla kolejnej liczby z listy *)
  43.       end
  44.   in pom lst d
  45. ;;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement