public LinkedListQueue(IEnumerable <T> collection)
        {
            if (collection == null)
            {
                throw new ArgumentNullException(nameof(collection));
            }

            items = new CircularDoublyLinkedList <T>(collection);
        }
Exemple #2
0
        public static Polygon2 Convexhull(IEnumerable <Vector2> vertices)
        {
            var pts = vertices.ToArray();

            if (!pts.Any())
            {
                return(new Polygon2());
            }



            // Sort points lexicographically by increasing (x, y)
            int n = pts.Length;

            Polysort.Quicksort(pts);


            var left  = pts[0];
            var right = pts[n - 1];

            // Partition into lower hull and upper hull
            var lower = new CircularDoublyLinkedList <Vector2>(left);
            var upper = new CircularDoublyLinkedList <Vector2>(left);

            for (int i = 0; i < n; i++)
            {
                double det = Vector2.Area2(left, right, pts[i]);
                if (det > 0)
                {
                    upper = upper.Append(new CircularDoublyLinkedList <Vector2>(pts[i]));
                }
                else if (det < 0)
                {
                    lower = lower.Prepend(new CircularDoublyLinkedList <Vector2>(pts[i]));
                }
            }
            lower = lower.Prepend(new CircularDoublyLinkedList <Vector2>(right));
            upper = upper.Append(new CircularDoublyLinkedList <Vector2>(right)).Next;
            // Eliminate points not on the hull
            Eliminate(lower);
            Eliminate(upper);
            // Eliminate duplicate endpoints
            if (lower.Prev.Value.Equals(upper.Value))
            {
                lower.Prev.Delete();
            }
            if (upper.Prev.Value.Equals(lower.Value))
            {
                upper.Prev.Delete();
            }
            // Join the lower and upper hull
            var res = new Vector2[lower.Size() + upper.Size()];

            lower.CopyInto(res, 0);
            upper.CopyInto(res, lower.Size());
            return(new Polygon2(res));
        }
Exemple #3
0
        public void AddNullItem()
        {
            var list = new CircularDoublyLinkedList <string>();

            list.AddFirst(null);
            list.AddLast(null);
            list.AddAfter(null, null);
            list.AddBefore(null, null);
            Assert.AreEqual(list.Count(), 4, "invalid count");
            list.Remove(null);
            list.RemoveFirst();
            list.RemoveLast();
            Assert.AreEqual(list.Count(), 1, "invalid count");
        }
Exemple #4
0
        public static void Main()
        {
            DoublyLinkedList <int> doublyLinkedList = new DoublyLinkedList <int>();

            doublyLinkedList.Add(1);
            doublyLinkedList.Add(2);
            doublyLinkedList.Add(3);
            doublyLinkedList.Add(4);
            doublyLinkedList.Add(5);
            doublyLinkedList.InsertAfter(5, 99);

            doublyLinkedList.Delete(5);

            Console.WriteLine(doublyLinkedList.Contains(5));

            foreach (object item in doublyLinkedList)
            {
                Console.WriteLine(item);
            }

            foreach (object item in doublyLinkedList.Reverse())
            {
                Console.WriteLine(item);
            }

            CircularDoublyLinkedList <int> circularDoublyLinkedList = new CircularDoublyLinkedList <int>();

            circularDoublyLinkedList.Add(1);
            circularDoublyLinkedList.Add(2);
            circularDoublyLinkedList.Add(3);
            circularDoublyLinkedList.Add(4);
            circularDoublyLinkedList.Add(5);

            circularDoublyLinkedList.Delete(3);

            circularDoublyLinkedList.InsertAfter(2, 99);

            Console.WriteLine(circularDoublyLinkedList.Contains(3));

            foreach (object item in circularDoublyLinkedList)
            {
                Console.WriteLine(item);
            }
        }
Exemple #5
0
        // Graham's scan
        private static void Eliminate(CircularDoublyLinkedList <Vector2> start)
        {
            CircularDoublyLinkedList <Vector2> v = start, w = start.Prev;
            bool fwd = false;

            while (v.Next != start || !fwd)
            {
                if (v.Next == w)
                {
                    fwd = true;
                }
                if (Vector2.Area2(v.Value, v.Next.Value, v.Next.Next.Value) < 0) // right turn
                {
                    v = v.Next;
                }
                else                                         // left turn or straight
                {
                    v.Next.Delete();
                    v = v.Prev;
                }
            }
        }
Exemple #6
0
 public void TestCleanup()
 {
     this.circularDoublyLinkedList = null;
 }
Exemple #7
0
 public void TestInitialize()
 {
     this.circularDoublyLinkedList = new CircularDoublyLinkedList <int>();
 }
Exemple #8
0
 public void AddNullCollection()
 {
     var list = new CircularDoublyLinkedList <int>(null);
 }
 public override void Clear()
 {
     items.Clear();
     items = new CircularDoublyLinkedList <T>();
 }
 public LinkedListQueue()
 {
     items = new CircularDoublyLinkedList <T>();
 }