Advertisement
Scylla7

NP Lab 7 Сортирана двојно поврзана листа

Dec 3rd, 2016
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 14.40 KB | None | 0 0
  1. import java.util.ArrayList;
  2. import java.util.Random;
  3. import java.util.Scanner;
  4. import java.util.TreeSet;
  5.  
  6.  
  7. class DLLNode<E extends Comparable<E>> {
  8.     protected E element;
  9.     protected DLLNode<E> pred, succ;
  10.  
  11.     public DLLNode(E elem, DLLNode<E> pred, DLLNode<E> succ) {
  12.         this.element = elem;
  13.         this.pred = pred;
  14.         this.succ = succ;
  15.     }
  16.  
  17.     @Override
  18.     public String toString() {
  19.         return element.toString();
  20.     }
  21. }
  22.  
  23. class DLL<E extends Comparable<E>> {
  24.     private DLLNode<E> first, last;
  25.  
  26.     public DLL() {
  27.         // Construct an empty SLL
  28.         this.first = null;
  29.         this.last = null;
  30.     }
  31.  
  32.     public void deleteList() {
  33.         first = null;
  34.         last = null;
  35.     }
  36.  
  37.     public int length() {
  38.         int ret;
  39.         if (first != null) {
  40.             DLLNode<E> tmp = first;
  41.             ret = 1;
  42.             while (tmp.succ != null) {
  43.                 tmp = tmp.succ;
  44.                 ret++;
  45.             }
  46.             return ret;
  47.         } else
  48.             return 0;
  49.  
  50.     }
  51.     public void insertFirst(E o) {
  52.         DLLNode<E> ins = new DLLNode<E>(o, null, first);
  53.         if (first == null)
  54.             last = ins;
  55.         else
  56.             first.pred = ins;
  57.         first = ins;
  58.     }
  59.  
  60.     public void insertLast(E o) {
  61.         if (first == null)
  62.             insertFirst(o);
  63.         else {
  64.             DLLNode<E> ins = new DLLNode<E>(o, last, null);
  65.             last.succ = ins;
  66.             last = ins;
  67.         }
  68.     }
  69.  
  70.     public void insertAfter(E o, DLLNode<E> after) {
  71.         if(after==last) {
  72.             insertLast(o);
  73.             return;
  74.         }
  75.         DLLNode<E> ins = new DLLNode<E>(o, after, after.succ);
  76.         after.succ.pred = ins;
  77.         after.succ = ins;
  78.     }
  79.     public DLLNode<E> find(E o) {
  80.         if (first != null) {
  81.             DLLNode<E> tmp = first;
  82.             while (tmp.element != o&&tmp.succ != null)
  83.                 tmp = tmp.succ;
  84.             if (tmp.element == o) {
  85.                 return tmp;
  86.             } else {
  87.                 System.out.println("Elementot ne postoi vo listata");
  88.             }
  89.         } else {
  90.             System.out.println("Listata e prazna");
  91.         }
  92.         return first;
  93.     }
  94.  
  95.     public E deleteFirst() {
  96.         if (first != null) {
  97.             DLLNode<E> tmp = first;
  98.             first = first.succ;
  99.             if (first != null) first.pred = null;
  100.             if (first == null)
  101.                 last = null;
  102.             return tmp.element;
  103.         } else
  104.             return null;
  105.     }
  106.  
  107.     public E deleteLast() {
  108.         if (first != null) {
  109.             if (first.succ == null)
  110.                 return deleteFirst();
  111.             else {
  112.                 DLLNode<E> tmp = last;
  113.                 last = last.pred;
  114.                 last.succ = null;
  115.                 return tmp.element;
  116.             }
  117.         }
  118.         // else throw Exception
  119.         return null;
  120.     }
  121.     public E delete(DLLNode<E> node) {
  122.         if(node==first) {
  123.             deleteFirst();
  124.             return node.element;
  125.         }
  126.         if(node==last) {
  127.             deleteLast();
  128.             return node.element;
  129.         }
  130.         node.pred.succ = node.succ;
  131.         node.succ.pred = node.pred;
  132.         return node.element;
  133.  
  134.     }
  135.     public void insertBefore(E o, DLLNode<E> before) {
  136.         if(before == first) {
  137.             insertFirst(o);
  138.             return;
  139.         }
  140.         DLLNode<E> ins = new DLLNode<E>(o, before.pred, before);
  141.         before.pred.succ = ins;
  142.         before.pred = ins;
  143.     }
  144.     @Override
  145.     public String toString() {
  146.         String ret = new String();
  147.         if (first != null) {
  148.             DLLNode<E> tmp = first;
  149.             ret += tmp + "<->";
  150.             while (tmp.succ != null) {
  151.                 tmp = tmp.succ;
  152.                 ret += tmp + "<->";
  153.             }
  154.         } else
  155.             ret = "Prazna lista!!!";
  156.         return ret;
  157.     }
  158.     public DLLNode<E> getFirst() {
  159.         return first;
  160.     }
  161.  
  162.     public DLLNode<E> getLast() {
  163.  
  164.         return last;
  165.     }
  166.  
  167. }
  168.  
  169. class SortedLinkedList<T extends Comparable<T>> {
  170.     private DLL<T> list;
  171.     public SortedLinkedList() {
  172.         list = new DLL<>();
  173.     }
  174.     public void add(T element) {
  175.         DLLNode<T> tmp = list.getFirst();
  176.         while(tmp != null) {
  177.             if(tmp.element.compareTo(element) == 0)
  178.                 return;
  179.             if(tmp.element.compareTo(element) > 0) {
  180.                 list.insertBefore(element, tmp);
  181.                 return;
  182.             }
  183.             tmp = tmp.succ;
  184.         }
  185.         if(tmp == null)
  186.             list.insertLast(element);
  187.     }
  188.     public boolean remove(T element) {
  189.        DLLNode<T> tmp = list.getFirst();
  190.        while(tmp != null){
  191.            if(tmp.element.compareTo(element) == 0){
  192.                list.delete(tmp);
  193.                return true;
  194.            }
  195.            if(tmp.element.compareTo(element) > 0)
  196.                return false;
  197.            tmp = tmp.succ;
  198.        }
  199.        return false;
  200.     }
  201.     public boolean contains(T element) {
  202.         DLLNode<T> tmp = list.getFirst();
  203.         while(tmp != null) {
  204.             if(tmp.element.compareTo(element) == 0)
  205.                 return true;
  206.             if(tmp.element.compareTo(element) > 0)
  207.                 return false;
  208.             tmp = tmp.succ;
  209.         }
  210.         return false;
  211.     }
  212.     public boolean isEmpty() {
  213.         return (list.getFirst() == null);
  214.     }
  215.     public int size() {
  216.         return list.length();
  217.     }
  218.     public ArrayList<T> toArrayList() {
  219.         ArrayList<T> tmp = new ArrayList<>();
  220.         DLLNode<T> node = list.getFirst();
  221.         while(node != null) {
  222.             tmp.add(node.element);
  223.             node = node.succ;
  224.         }
  225.         return tmp;
  226.     }
  227.     public void addAll(SortedLinkedList<? extends T> sll) {
  228.         DLLNode<T> tmp = (DLLNode<T>) sll.list.getFirst();
  229.         DLLNode<T> position = list.getFirst();
  230.         while(tmp != null&&position != null){
  231.             if(position.element.compareTo(tmp.element) == 0){
  232.                 position = position.succ;
  233.                 tmp = tmp.succ;
  234.                 continue;
  235.             }
  236.             else if(position.element.compareTo(tmp.element) > 0){
  237.                 list.insertBefore(tmp.element, position);
  238.                 tmp = tmp.succ;
  239.             }
  240.             else{
  241.                 position = position.succ;
  242.             }
  243.         }
  244.         if(position == null&&tmp != null){
  245.             while(tmp != null){
  246.                 list.insertLast(tmp.element);
  247.                 tmp = tmp.succ;
  248.             }
  249.         }
  250.        
  251.     }
  252.     public boolean containsAll(SortedLinkedList<? extends T> sll) {
  253.        DLLNode<T> tmp = (DLLNode<T>) sll.list.getFirst();
  254.         DLLNode<T> position = list.getFirst();
  255.         while(tmp != null && position != null){
  256.             if(position.element.compareTo(tmp.element) == 0){
  257.                 tmp = tmp.succ;
  258.                 position = position.succ;
  259.             }
  260.             else{
  261.                 position = position.succ;
  262.             }
  263.         }
  264.         if(position == null && tmp != null)
  265.             return false;
  266.         else
  267.             return true;
  268.     }
  269. }
  270.  
  271.  
  272.  
  273. public class SortedLinkedListTest {
  274.     public static void main(String[] args) {
  275.         Scanner jin = new Scanner(System.in);
  276.         int k = jin.nextInt();
  277.         System.out.println("Test#"+k);
  278.         System.out.print("testing SortedLinkedList::toArrayList():ArrayList<T> ,");
  279.         if ( k == 0 ) {
  280.             System.out.println(" SortedLinkedList::add(T), SortedLinkedList::isEmpty():boolean , SortedLinkedList::remove(T):boolean , SortedLinkedList::size():int , T is Integer");
  281.  
  282.             SortedLinkedList<Integer> list = new SortedLinkedList<Integer>();
  283.             System.out.println("List is empty? "+list.isEmpty());
  284.             System.out.println("Adding elements:");
  285.             boolean flag = false;
  286.             while ( jin.hasNextInt() ) {
  287.                 System.out.print(flag?" ":"");
  288.                 int i = jin.nextInt();
  289.                 list.add(i);
  290.                 System.out.print(i);
  291.                 flag = true;
  292.             }
  293.             System.out.println();
  294.             System.out.println("List size? "+list.size());
  295.             jin.next();
  296.             flag = false;
  297.             System.out.println("Removing elements:");
  298.             while ( jin.hasNextInt() ) {
  299.                 System.out.print(flag?" ":"");
  300.                 int i = jin.nextInt();
  301.                 list.remove(i);
  302.                 System.out.print(i);
  303.                 flag = true;
  304.             }
  305.             System.out.println();
  306.             System.out.println("List size? "+list.size());
  307.             System.out.println("Final list: "+list.toArrayList());
  308.         }
  309.         if ( k == 1 ) {
  310.             System.out.println(" SortedLinkedList::add(T) , T is Integer");
  311.             System.out.println("Adding elements:");
  312.             SortedLinkedList<Integer> list = new SortedLinkedList<Integer>();
  313.             boolean flag = false;
  314.             while ( jin.hasNextInt() ) {
  315.                 System.out.print(flag?" ":"");
  316.                 int i = jin.nextInt();
  317.                 list.add(i);
  318.                 System.out.print(i);
  319.                 flag = true;
  320.             }
  321.             System.out.println();
  322.             System.out.print("Final list: ");
  323.             System.out.println(list.toArrayList());
  324.         }
  325.         if ( k == 2 ) {
  326.             System.out.println(" SortedLinkedList::add(T) , SortedLinkedList::addAll(SortedLinkedList<? etends T>) , T is Integer");
  327.  
  328.             int num_testcases = jin.nextInt();
  329.             for ( int w = 0 ; w < num_testcases ; ++w ) {
  330.                 System.out.println("Subtest #"+(w+1));
  331.                 SortedLinkedList<Integer> list = new SortedLinkedList<Integer>();
  332.                 while ( jin.hasNextInt() ) {
  333.                     list.add(jin.nextInt());
  334.                 }
  335.                 SortedLinkedList<Integer> query = new SortedLinkedList<Integer>();
  336.                 jin.next();
  337.                 while ( jin.hasNextInt() ) {
  338.                     query.add(jin.nextInt());
  339.                 }
  340.                 System.out.println("List a="+list.toArrayList());
  341.                 System.out.println("List b="+query.toArrayList());
  342.                 list.addAll(query);
  343.                 System.out.println("Add all elements from b to a");
  344.                 System.out.println("List a="+list.toArrayList());
  345.                 jin.next();
  346.             }
  347.         }
  348.         if ( k == 3 ) {
  349.             System.out.println(" SortedLinkedList::add(T) , SortedLinkedList::containsAll(SortedLinkedList<? etends T>) , T is Integer");
  350.             int num_testcases = jin.nextInt();
  351.             for ( int w = 0 ; w < num_testcases ; ++w ) {
  352.                 System.out.println("Subtest #"+(w+1));
  353.                 SortedLinkedList<Integer> list = new SortedLinkedList<Integer>();
  354.                 while ( jin.hasNextInt() ) {
  355.                     list.add(jin.nextInt());
  356.                 }
  357.                 SortedLinkedList<Integer> query = new SortedLinkedList<Integer>();
  358.                 jin.next();
  359.                 while ( jin.hasNextInt() ) {
  360.                     query.add(jin.nextInt());
  361.                 }
  362.                 System.out.println("List a="+list.toArrayList());
  363.                 System.out.println("List b="+query.toArrayList());
  364.                 System.out.println("List a contains all elements in list b? "+list.containsAll(query));
  365.                 jin.next();
  366.             }
  367.         }
  368.         if ( k == 4 ) {
  369.             System.out.println(" SortedLinkedList::add(T) , SortedLinkedList::remove(T):boolean , SortedLinkedList::contains(T) , T is String");
  370.             SortedLinkedList<String> list = new SortedLinkedList<String>();
  371.             TreeSet<String> control_list = new TreeSet<String>();
  372.             ArrayList<String> all = new ArrayList<String>();
  373.             all.add("Sample");
  374.             boolean same = true;
  375.             for ( int i = 0 ; i < 1000 ; ++i ) {
  376.                 double rand = Math.random();
  377.                 if ( rand > 0.3 ) { //addelement
  378.                     String srand = randomString();
  379.                     if ( Math.random() < 0.1 ) {
  380.                         srand = all.get((int)(Math.random()*all.size()));
  381.                     }
  382.                     control_list.add(srand);
  383.                     list.add(srand);
  384.                 }
  385.                 if ( rand >= 0.3&&rand < 0.8 ) {//query
  386.                     String srand = randomString();
  387.                     if ( Math.random() < 0.6 ) {
  388.                         srand = all.get((int)(Math.random()*all.size()));
  389.                     }
  390.                     same &= control_list.contains(srand)==list.contains(srand);
  391.                 }
  392.                 if ( rand >= 0.8 ) {//remove
  393.                     String srand = randomString();
  394.                     if ( Math.random() < 0.8 ) {
  395.                         srand = all.get((int)(Math.random()*all.size()));
  396.                     }
  397.                     control_list.remove(srand);
  398.                     list.remove(srand);
  399.                 }
  400.             }
  401.             System.out.println("Your list outputs compared to the built in java structure were the same? "+same);
  402.  
  403.         }
  404.         if ( k == 5 ) {
  405.             System.out.println(" SortedLinkedList::add(T) , SortedLinkedList::remove(T):boolean , T is Long");
  406.             int n = jin.nextInt();
  407.             SortedLinkedList<Long> list = new SortedLinkedList<Long>();
  408.             ArrayList<Long> all = new ArrayList<Long>();
  409.             all.add(684165189745L);
  410.             for ( int i = 0 ; i < n ; ++i ) {
  411.                 double rand = Math.random();
  412.                 if ( rand < 0.7 ) { //addelement
  413.                     Long srand = (long) (Math.random()*45668948941984L);
  414.                     if ( Math.random() < 0.1 ) {
  415.                         srand = all.get((int)(Math.random()*all.size()));
  416.                     }
  417.                     list.add(srand);
  418.                 }
  419.                 if ( rand >= 0.7 ) {
  420.                     Long srand = (long) (Math.random()*45668948941984L);
  421.                     if ( Math.random() < 0.1 ) {
  422.                         srand = all.get((int)(Math.random()*all.size()));
  423.                     }
  424.                     list.remove(srand);
  425.                 }
  426.             }
  427.             System.out.println("Your program was really fast. You are a great developer!");
  428.         }
  429.     }
  430.     private static String randomString() {
  431.         byte buf[] = new byte[(int)(Math.random()*10)+1];
  432.         new Random().nextBytes(buf);
  433.         return new String(buf);
  434.     }
  435. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement