示例#1
0
        public override string ToString()
        {
            StringBuilder        s = new StringBuilder();
            SingleLinkedNode <T> p = head;

            while (p.Next != null)
            {
                s.Append(p.Next);
                p = p.Next;
            }
            return(s.ToString());
        }
示例#2
0
        ///<summary>以一个数组的多个元素构造单向链表</summary>
        public SingleLinkedList(T[] a) : this()
        {
            SingleLinkedNode <T> rear, q;

            rear = head;
            for (int i = 0; i < a.Length; i++)
            {
                q         = new SingleLinkedNode <T>(a[i]);
                rear.Next = q;
                rear      = q;
            }
        }
示例#3
0
        public SingleLinkedList(T[] itemArray) : this()//使用一个数组创建线性表
        {
            SingleLinkedNode <T> rear, q;

            rear = head;//指向链表尾结点
            for (int i = 0; i < itemArray.Length; i++)
            {
                q         = new SingleLinkedNode <T>(itemArray[i]);//新建一个结点
                rear.Next = q;
                rear      = q;
            }
        }
示例#4
0
        public bool Contain(T item)
        {
            bool isContain         = false;
            SingleLinkedNode <T> p = head;

            while ((p.Next != null) && (!isContain))//一旦找到就可以提前退出循环
            {
                isContain = item.Equals(p.Next.Item);
                p         = p.Next;
            }
            return(isContain);
        }
示例#5
0
        public void add(SingleLinkedList <T> tar, int startOfMe, int startOfTar, int num)//从SingleLinkedList复制并插入元素
        {
            if (tar.getLength == 0)
            {
                return;
            }
            if (num > tar.getLength - startOfTar)
            {
                num = tar.getLength - startOfTar;
            }
            int i;

            tar.repos(startOfTar);
            if (length == 0)
            {
                i   = 1;
                pos = new SingleLinkedNode <T>(tar[0]);
                tar.repos(1);
                length++;
            }
            else
            {
                i = 0;
            }
            SingleLinkedNode <T> first = pos;

            if (startOfMe >= 0)
            {
                for (int j = 0; j < startOfMe; j++)
                {
                    first = first.Next;
                }
            }
            else
            {
                for (int j = 0; j > startOfMe; j--)
                {
                    first = first.Last;
                }
            }
            for (; i < num; i++)
            {
                SingleLinkedNode <T> now = new SingleLinkedNode <T>(tar[0], first, first.Next);
                tar.repos(1);
                now.Last.Next = now;
                first         = now;
                length++;
            }
            tar.repos(-startOfTar - i);
            first.Next.Last = first;
        }
示例#6
0
        public void add(T[] tar, int startOfMe, int startOfTar, int num)//从数组复制并插入元素
        {
            if (tar.Length == 0)
            {
                return;
            }
            if (startOfTar < 0)
            {
                return;
            }
            if (num > tar.Length - startOfTar)
            {
                num = tar.Length - startOfTar;
            }
            int i;

            if (length == 0)
            {
                i   = 1;
                pos = new SingleLinkedNode <T>(tar[startOfTar]);
                length++;
            }
            else
            {
                i = 0;
            }
            SingleLinkedNode <T> first = pos;

            if (startOfMe >= 0)
            {
                for (int j = 0; j < startOfMe; j++)
                {
                    first = first.Next;
                }
            }
            else
            {
                for (int j = 0; j > startOfMe; j--)
                {
                    first = first.Last;
                }
            }
            for (; i < num; i++)
            {
                SingleLinkedNode <T> now = new SingleLinkedNode <T>(tar[startOfTar + i], first, first.Next);
                now.Last.Next = now;
                first         = now;
                length++;
            }
            first.Next.Last = first;
        }
示例#7
0
        public T[] ToArray()
        {
            T[] array = new T[Count];
            SingleLinkedNode <T> p = head;
            int i = 0;

            while (p.Next != null)
            {
                array[i] = p.Next.Item;
                p        = p.Next;
                i++;
            }
            return(array);
        }
示例#8
0
        public void add(T tar)//插入元素
        {
            if (length == 0)
            {
                pos = new SingleLinkedNode <T>(tar);
                length++;
                return;
            }
            SingleLinkedNode <T> first = new SingleLinkedNode <T>(tar, pos.Last, pos);

            pos.Last.Next = first;
            pos.Last      = first;
            length++;
        }
示例#9
0
 private void reQuickSort(int s, int e)
 {
     if (s < e)
     {
         int i, j;
         T   x1, x2;
         i = s;
         j = e;
         SingleLinkedNode <T> first = pos;
         for (int k = 0; k < i; k++)
         {
             first = first.Next;
         }
         x1 = first.Data;
         x2 = first.Data;
         SingleLinkedNode <T> last = pos;
         for (int k = 0; k < j; k++)
         {
             last = last.Next;
         }
         while (i < j)
         {
             while (i < j && last.Data.CompareTo(x1) < 0)
             {
                 j--;
                 last = last.Last;
             }
             if (i < j)
             {
                 first.Data = last.Data;
                 i++;
                 first = first.Next;
             }
             while (i < j && first.Data.CompareTo(x1) > 0)
             {
                 i++;
                 first = first.Next;
             }
             if (i < j)
             {
                 last.Data = first.Data;
                 j--;
                 last = last.Last;
             }
         }
         first.Data = x2;
         reQuickSort(s, i - 1);
         reQuickSort(i + 1, e);
     }
 }
示例#10
0
 public T Dequeue()
 {
     if (Empty)
     {
         throw new InvalidOperationException("The queue is empty:" + this.GetType());
     }
     else
     {
         T out_item = front.Item;
         Head.Next = front.Next;
         front     = Head.Next;
         return(out_item);
     }
 }
示例#11
0
 public void Show()
 {
     if (!Empty)
     {
         SingleLinkedNode <T> p = head.Next;
         while (p.Next != head.Next)
         {
             p.Show();
             Console.Write("  ");
             p = p.Next;
         }
         p.Show();
     }
 }
示例#12
0
 public T Pop()
 {
     if (Empty)
     {
         throw new InvalidOperationException("Stack is empty" + this.GetType());
     }
     else
     {
         T value = default(T);
         value          = top.Item;
         top            = top.Next;
         base.Head.Next = top;
         return(value);
     }
 }
示例#13
0
        public void AddRange(T[] itemArray)
        {
            SingleLinkedNode <T> p = head;

            while (p.Next != null)
            {
                p = p.Next;
            }
            for (int i = 0; i < itemArray.Length; i++)
            {
                SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(itemArray[i]);
                p.Next = new_item;
                p      = p.Next;
            }
        }
示例#14
0
        public void add(SequencedList <T> tar, int startOfMe, int startOfTar = 0)//从SequencedList复制并插入元素
        {
            if (tar.getLength == 0)
            {
                return;
            }
            if (startOfTar < 0)
            {
                return;
            }
            int i;

            if (length == 0)
            {
                i   = 1;
                pos = new SingleLinkedNode <T>(tar[startOfTar]);
                length++;
            }
            else
            {
                i = 0;
            }
            int num = tar.getLength;
            SingleLinkedNode <T> first = pos;

            if (startOfMe >= 0)
            {
                for (int j = 0; j < startOfMe; j++)
                {
                    first = first.Next;
                }
            }
            else
            {
                for (int j = 0; j > startOfMe; j--)
                {
                    first = first.Last;
                }
            }
            for (; i < num; i++)
            {
                SingleLinkedNode <T> now = new SingleLinkedNode <T>(tar[startOfTar + i], first, first.Next);
                now.Last.Next = now;
                first         = now;
                length++;
            }
            first.Next.Last = first;
        }
示例#15
0
        public void Remove(T item)
        {
            SingleLinkedNode <T> p = head;
            SingleLinkedNode <T> q = head.Next;

            while (q.Next != null)
            {
                if (item.Equals(q.Item))
                {
                    p.Next = q.Next;
                    break;
                }
                p = p.Next;
                q = q.Next;
            }
        }
示例#16
0
        public void Enqueue(T item)
        {
            SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(item);

            if (Empty)
            {
                Head.Next = new_item;
                front     = rear = new_item;
            }
            else
            {
                rear.Next = new_item;
                rear      = rear.Next;
                front     = Head.Next;
            }
        }
示例#17
0
        public int reverseFind(T tar, int start, int end)//从右到左查找元素
        {
            int id = start;
            SingleLinkedNode <T> s = pos;
            SingleLinkedNode <T> e = pos;

            if (start >= 0)
            {
                for (int j = 0; j < start; j++)
                {
                    s = s.Next;
                }
            }
            else
            {
                for (int j = 0; j > start; j--)
                {
                    s = s.Last;
                }
            }
            if (end >= 0)
            {
                for (int j = 0; j < start; j++)
                {
                    e = e.Next;
                }
            }
            else
            {
                for (int j = 0; j > start; j--)
                {
                    e = e.Last;
                }
            }
            while (s != e)
            {
                if (s.Data.CompareTo(tar) == 0)
                {
                    return(id);
                }
                s = s.Last;
                id--;
            }
            return(-1);
        }
示例#18
0
        public void Add(T item)
        {
            SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(item);
            SingleLinkedNode <T> p        = first;

            if (first == null)
            {
                first = new_item;
            }
            else
            {
                while (p.Next != null)
                {
                    p = p.Next;
                }
                p.Next = new_item;
            }
        }
示例#19
0
 public bool Contain(T item)
 {
     if (Empty)
     {
         return(false);
     }
     else
     {
         bool isContain         = false;
         SingleLinkedNode <T> p = head.Next;
         while ((p.Next != head.Next) && (!isContain))//一旦找到就可以提前退出循环
         {
             isContain = item.Equals(p.Next.Item);
             p         = p.Next;
         }
         return(isContain);
     }
 }
示例#20
0
 public void RemoveAt(int index)
 {
     if ((index < 0) || (index >= Count))
     {
         throw new IndexOutOfRangeException("Index out of Range!!!");
     }
     else
     {
         SingleLinkedNode <T> p = head;
         SingleLinkedNode <T> q = head.Next;
         for (int i = 0; i < index; i++)
         {
             p = p.Next;
             q = q.Next;
         }
         p.Next = q.Next;
     }
 }
示例#21
0
        public void delete(int start, int num)//删除元素
        {
            if (length == 0)
            {
                return;
            }
            if (num <= 0)
            {
                return;
            }
            if (num > length)
            {
                num = length;
            }
            SingleLinkedNode <T> first = pos;

            if (start >= 0)
            {
                for (int j = 0; j < start; j++)
                {
                    first = first.Next;
                }
            }
            else
            {
                for (int j = 0; j > start; j--)
                {
                    first = first.Last;
                }
            }
            SingleLinkedNode <T> now = first;

            for (int i = 0; i < num; i++)
            {
                now = now.Next;
            }
            now.Last        = first.Last;
            first.Last.Next = now;
            if (start <= 0 && start + num >= 0)
            {
                pos = now;
            }
            length -= num;
        }
示例#22
0
 public void InsertRange(int index, T[] itemArray)
 {
     if ((index < 0) || (index >= Count))
     {
         throw new IndexOutOfRangeException("Index out of range!!!");
     }
     else
     {
         if (index == 0)
         {
             //保存原来的第一个元素
             SingleLinkedNode <T> p = first;
             first = new SingleLinkedNode <T>(itemArray[0]);
             //新链表的第一个元素
             SingleLinkedNode <T> q = first;
             for (int i = 1; i < itemArray.Length; i++)
             {
                 //新的数组有多少个元素就必须新建多少个对象
                 SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(itemArray[i]);
                 q.Next = new_item;
                 q      = q.Next;
             }
             q.Next = p;
         }
         else
         {
             SingleLinkedNode <T> p = first;
             SingleLinkedNode <T> q = first.Next;
             for (int i = 1; i < index; i++)
             {
                 p = p.Next;
                 q = q.Next;
             }
             for (int i = 0; i < itemArray.Length; i++)
             {
                 //新的数组有多少个元素就必须新建多少个对象
                 SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(itemArray[i]);
                 p.Next = new_item;
                 p      = p.Next;
             }
             p.Next = q;
         }
     }
 }
示例#23
0
 public T this[int i]//链表的索引器
 {
     get
     {
         SingleLinkedNode <T> first = pos;
         if (i >= 0)
         {
             for (int j = 0; j < i; j++)
             {
                 first = first.Next;
             }
             return(first.Data);
         }
         else
         {
             for (int j = 0; j > i; j--)
             {
                 first = first.Last;
             }
             return(first.Data);
         }
     }
     set
     {
         SingleLinkedNode <T> first = pos;
         if (i >= 0)
         {
             for (int j = 0; j < i; j++)
             {
                 first = first.Next;
             }
             first.Data = value;
         }
         else
         {
             for (int j = 0; j > i; j--)
             {
                 first = first.Last;
             }
             first.Data = value;
         }
     }
 }
示例#24
0
        public int IndexOf(T item)
        {
            int index = 0;
            SingleLinkedNode <T> p = head;

            while (p.Next != null)
            {
                if (item.Equals(p.Next.Item))//一旦找到匹配的就立刻退出函数
                {
                    return(index);
                }
                else
                {
                    index++;
                    p = p.Next;
                }
            }
            return(-1);
        }
示例#25
0
 //索引器
 public virtual T this[int i]
 {
     get
     {
         if ((i < 0) || (i >= Count))
         {
             throw new IndexOutOfRangeException("Index is out of range " + this.GetType());
         }
         else
         {
             SingleLinkedNode <T> p = head.Next;
             while (i > 0)
             {
                 p = p.Next;
                 i--;
             }
             return(p.Item);
         }
     }
 }
示例#26
0
        public SingleLinkedList(SingleLinkedList <T> tar)//使用SingleLinkedList初始化
        {
            if (tar.getLength == 0)
            {
                return;
            }
            SingleLinkedNode <T> first;
            SingleLinkedNode <T> next;

            first = new SingleLinkedNode <T>(tar[0]);
            pos   = first;
            length++;
            for (int i = 1; i < tar.getLength; i++)
            {
                next       = new SingleLinkedNode <T>(tar[i], first, pos);
                first.Last = next;
                first      = next;
                length++;
            }
        }
示例#27
0
 public void Insert(int index, T item)
 {
     if ((index < 0) || (index >= Count))
     {
         throw new IndexOutOfRangeException("Index is out of range " + this.GetType());
     }
     else
     {
         SingleLinkedNode <T> p        = head;
         SingleLinkedNode <T> q        = head.Next;
         SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(item);
         for (int i = 0; i < index; i++)
         {
             p = p.Next;
             q = q.Next;
         }
         p.Next        = new_item;
         new_item.Next = q;
     }
 }
示例#28
0
        public void Add(T item)
        {
            SingleLinkedNode <T> new_item = new SingleLinkedNode <T>(item);

            if (Empty)
            {
                head.Next     = new_item;
                new_item.Next = head.Next;
            }
            else
            {
                SingleLinkedNode <T> p = head.Next;
                while (p.Next != head.Next)
                {
                    p = p.Next;
                }
                p.Next        = new_item;
                new_item.Next = head.Next;
            }
        }
示例#29
0
        /// <summary>
        /// 弹出链式栈栈顶数据元素,栈为空时报异常
        /// </summary>
        public T Pop()
        {
            //置变量k为T类型的缺省值
            //对于引用类型,将为 NULL;对于值类型,将为零;对于结构,将为 0 位模式
            T k = default(T);

            //栈不空
            if (!Empty)
            {
                //取得栈顶数据元素值
                k   = top.Item;
                top = top.Next;
                //删除栈顶结点
                base.Head.Next = top;
                return(k);
            }
            else
            {
                throw new InvalidOperationException("Stack is Empty: " + this.GetType());
            }
        }
示例#30
0
 public void Remove(T item)
 {
     if (item.Equals(this[0]))//移除头结点
     {
         SingleLinkedNode <T> p = head.Next;
         while (p.Next != head.Next)
         {
             p = p.Next;
         }
         p.Next    = head.Next.Next;
         head.Next = head.Next.Next;
     }
     else if (item.Equals(this[Count - 1]))//移除尾结点
     {
         SingleLinkedNode <T> p = head;
         SingleLinkedNode <T> q = head.Next;
         while (q.Next != head.Next)
         {
             p = p.Next;
             q = q.Next;
         }
         p.Next = head.Next;
     }
     else//移除中间结点
     {
         SingleLinkedNode <T> p = head;
         SingleLinkedNode <T> q = head.Next;
         while (q.Next != head.Next)
         {
             if (item.Equals(q.Item))
             {
                 p.Next = q.Next;
                 break;
             }
             p = p.Next;
             q = q.Next;
         }
     }
 }