zoukankan      html  css  js  c++  java
  • C#实现链表zz

    链表:链表是用一组任意的存储单元来存储线性表中的数据元素。为此,在存储数据元素时,除了存储数据元 素本身的信息外,还要存储与它相邻的数据元素的存储地址信息。这两部分信息组成该数据元素的存储映像,称为结点(Node)。把存储据元素本身 信息的域叫结点的数据域,把存储与它相邻的数据元素的存储地址信息的域叫结点的引用域。

    节点类:

    代码
    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace DateStructrues.Lists.Node
    {
        
    /// <summary>
        
    /// 节点类。
        
    /// </summary>
        
    /// <typeparam name="T"></typeparam>
        public class DNode<T>
        {
            
    #region Fields

            
    //
            
    //数据域
            
    //
            T _data;

            
    //
            
    //地址域(下一个)
            
    //
            DNode<T> _next;

            
    //
            
    //地址域(上一个)
            
    //
            DNode<T> _prev;

            
    #endregion

            
    #region Constructor

            
    /// <summary>
            
    /// 构造器
            
    /// </summary>
            
    /// <param name="value"></param>
            public DNode(T value)
            {
                _data 
    = value;
            }

            
    /// <summary>
            
    /// 构造器
            
    /// </summary>
            
    /// <param name="value"></param>
            
    /// <param name="prev"></param>
            
    /// <param name="next"></param>
            public DNode(T value, DNode<T> prev, DNode<T> next)
            {
                _data 
    = value;
                _prev 
    = prev;
                _next 
    = next;
            }

            
    /// <summary>
            
    /// 构造器
            
    /// </summary>
            public DNode() { }

            
    #endregion

            
    #region Properties

            
    /// <summary>
            
    /// 地址域属性(上一个)。
            
    /// </summary>
            public DNode<T> Prev
            {
                
    get
                {
                    
    return _prev;
                }
                
    set
                {
                    _prev 
    = value;
                }
            }

            
    /// <summary>
            
    /// 地址域属性(下一个)。
            
    /// </summary>
            public DNode<T> Next
            {
                
    get
                {
                    
    return _next;
                }
                
    set
                {
                    _next 
    = value;
                }
            }

            
    /// <summary>
            
    /// 数据域属性。
            
    /// </summary>
            public T Data
            {
                
    get
                {
                    
    return _data;
                }
                
    set
                {
                    _data 
    = value;
                }
            }

            
    #endregion
        }
    }

    链表:

    代码
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;

    namespace DateStructrues.Lists.Node
    {
        
    /// <summary>
        
    /// 链表
        
    /// </summary>
        
    /// <typeparam name="T">数据类型</typeparam>
        public class LinkList<T> : IList<T>
        {
            
    #region Fields

            
    //
            
    // 头节点
            
    //
            Node<T> head;

            
    //
            
    // 尾节点
            
    //
            Node<T> rear;

            
    //
            
    // 记录节点的个数
            
    //
            int count;

            
    #endregion

            
    #region Methods

            
    /// <summary>
            
    /// 通过遍历,求链表的长度。
            
    /// </summary>
            
    /// <returns>长度</returns>
            public int GetCount()
            {
                
    int count = 0;
                Node
    <T> p = head;
                
    while (p != null)
                {
                    count
    ++;
                    p 
    = p.Next;
                }
                
    return count;
            }

            
    /// <summary>
            
    /// 获得节点。
            
    /// </summary>
            
    /// <param name="index">索引</param>
            
    /// <returns>对应的节点</returns>
            public Node<T> GetNodeByIndex(int index)
            {
                
    if (index < 0)
                {
                    
    return null;
                }

                Node
    <T> p = head;
                
    int count = 0;
                
    while (p != null)
                {
                    
    if (index == count)
                    {
                        
    return p;
                    }
                    count
    ++;
                    p 
    = p.Next;
                }
                
    return null;
            }

            
    /// <summary>
            
    /// 复制
            
    /// </summary>
            
    /// <returns></returns>
            public LinkList<T> Copy()
            {
                LinkList
    <T> tmp = new LinkList<T>();
                tmp.head 
    = new Node<T>(head.Data);
                Node
    <T> p1 = tmp.head;
                Node
    <T> p2 = head.Next;

                
    while (p2 != null)
                {
                    Node
    <T> tmpNode = new Node<T>(p2.Data);
                    p1.Next 
    = tmpNode;

                    p1 
    = p1.Next;
                    p2 
    = p2.Next;
                }

                
    return tmp;
            }

            
    /// <summary>
            
    /// 倒序
            
    /// </summary>
            public void Revers()
            {
                Node
    <T> p = head.Next;
                Node
    <T> q = new Node<T>();
                head.Next 
    = null;
                
    while (p != null)
                {
                    q 
    = p;
                    p 
    = p.Next;
                    q.Next 
    = head.Next;
                    head.Next 
    = q;
                }
            }

            
    /// <summary>
            
    /// 合并
            
    /// </summary>
            
    /// <param name="Ha"></param>
            
    /// <param name="Hb"></param>
            
    /// <returns></returns>
            public static LinkList<int> Merge(LinkList<int> Ha, LinkList<int> Hb)
            {
                LinkList
    <int> Hc = new LinkList<int>();
                Node
    <int> p = Ha.head;
                Node
    <int> q = Hb.head;
                Node
    <int> s = new Node<int>();
                Hc 
    = Ha;
                Hc.head 
    = null;
                
    while (p != null && q != null)
                {
                    
    if (p.Data < q.Data)
                    {
                        s 
    = p;
                        p 
    = p.Next;
                    }
                    
    else
                    {
                        s 
    = q;
                        q 
    = q.Next;
                    }
                    Hc.Add(s.Data);
                }
                
    if (p == null)
                {
                    p 
    = q;
                }
                
    while (p != null)
                {
                    s 
    = p;
                    p 
    = p.Next;
                    Hc.Add(s.Data);
                }
                
    return Hc;
            }

            
    /// <summary>
            
    /// 合并,由于同上一个合并方法签名相同,即不能重载
            
    /// </summary>
            
    /// <param name="Ha"></param>
            
    /// <param name="Hb"></param>
            
    /// <returns></returns>
            public static LinkList<int> Merge2(LinkList<int> Ha, LinkList<int> Hb)
            {
                LinkList
    <int> Hc = new LinkList<int>();
                Node
    <int> p = Ha.head;
                Node
    <int> q = Hb.head;
                Node
    <int> s = new Node<int>();
                Hc 
    = Ha;
                Hc.head 
    = null;
                
    //两个表非空
                while (p != null && q != null)
                {
                    
    if (p.Data < q.Data)
                    {
                        s 
    = p;
                        p 
    = p.Next;
                    }
                    
    else
                    {
                        s 
    = q;
                        q 
    = q.Next;
                    }
                    s.Next 
    = Hc.head;
                    Hc.head 
    = s;
                }
                
    //第2个表非空而第1个表为空
                if (p == null)
                {
                    p 
    = q;
                }
                
    //将两表中的剩余数据元素附加到新表的末尾
                while (p != null)
                {
                    s 
    = p;
                    p 
    = p.Next;
                    s.Next 
    = Hc.head;
                    Hc.head 
    = s;
                }
                
    return Hc;
            }

            
    /// <summary>
            
    /// 取消
            
    /// </summary>
            
    /// <param name="Ha"></param>
            
    /// <returns></returns>
            public static LinkList<int> Purge(LinkList<int> Ha)
            {
                LinkList
    <int> Hb = new LinkList<int>();
                Node
    <int> p = Ha.head;
                Node
    <int> q = new Node<int>();
                Node
    <int> s = new Node<int>();
                s 
    = p;
                p 
    = p.Next;
                s.Next 
    = null;
                Hb.head 
    = s;
                
    while (p != null)
                {
                    s 
    = p;
                    p 
    = p.Next;
                    q 
    = Hb.head;
                    
    while (q != null && q.Data != s.Data)
                    {
                        q 
    = q.Next;
                    }
                    
    if (q == null)
                    {
                        s.Next 
    = Hb.head;
                        Hb.head 
    = s;
                    }
                }
                
    return Hb;
            }

            
    #endregion

            
    #region Properties

            
    /// <summary>
            
    /// 数组模式,主要用于调试时查看。
            
    /// </summary>
            public T[] ArrayMode
            {
                
    get
                {
                    T[] arr 
    = new T[Count];
                    Node
    <T> p = head;
                    
    int count = 0;
                    
    while (p != null)
                    {
                        arr[count] 
    = p.Data;
                        p 
    = p.Next;
                        count
    ++;
                    }
                    
    return arr;
                }
            }

            
    #endregion

            
    #region IList<T> 成员

            
    /// <summary>
            
    /// 求元素所在的索引。
            
    /// </summary>
            
    /// <param name="item">要查找的元素</param>
            
    /// <returns>所在索引</returns>
            public int IndexOf(T item)
            {
                
    // 用于遍历链表
                Node<T> p = head;

                
    // 计数器
                int count = 0;

                
    while (p != null)
                {
                    
    if (p.Data.Equals(item))
                    {
                        
    return count;
                    }

                    count
    ++;

                    
    // 移到下一个节点
                    p = p.Next;
                }
                
    return -1;
            }

            
    /// <summary>
            
    /// 插入元素。
            
    /// </summary>
            
    /// <param name="index">索引</param>
            
    /// <param name="item">要插入的项</param>
            public void Insert(int index, T item)
            {
                
    int count = 1;
                Node
    <T> p = head;
                Node
    <T> v = new Node<T>(item);
                
    if (index == 0)
                {
                    
    if (head == null)
                    {
                        rear 
    = v;
                    }

                    v.Next 
    = head;
                    head 
    = v;
                    
    this.count++;
                    
    return;
                }

                
    while (p != null)
                {
                    
    if (count == index)
                    {
                        
    if (p.Next == null)
                            rear 
    = v;
                        v.Next 
    = p.Next;
                        p.Next 
    = v;

                        
    this.count++;
                        
    break;
                    }
                    p 
    = p.Next;
                    count
    ++;
                }
            }

            
    /// <summary>
            
    /// 以索引方式删除元素
            
    /// </summary>
            
    /// <param name="index">索引</param>
            public void RemoveAt(int index)
            {
                
    int count = 0;
                
    if (index == 0)
                {
                    head 
    = head.Next;
                    
    this.count--;
                    
    return;
                }
                Node
    <T> p = head;
                Node
    <T> prev = head;
                
    while (p != null)
                {
                    
    if (count == index)
                    {
                        prev.Next 
    = p.Next;
                        
    this.count--;
                        
    if (p.Next == null)
                        {
                            rear 
    = prev;
                        }
                        
    break;
                    }
                    prev 
    = p;
                    p 
    = p.Next;
                    count
    ++;
                }
            }

            
    /// <summary>
            
    /// 以索引方式访问
            
    /// </summary>
            
    /// <param name="index">索引</param>
            
    /// <returns>对应的元素</returns>
            public T this[int index]
            {
                
    get
                {
                    
    try
                    {
                        Node
    <T> p = GetNodeByIndex(index);
                        
    return p.Data;
                    }
                    
    catch (NullReferenceException)
                    {
                        
    throw new IndexOutOfRangeException("索引超出数组界限。");
                    }
                }
                
    set
                {
                    
    try
                    {
                        Node
    <T> p = GetNodeByIndex(index);
                        p.Data 
    = value;
                    }
                    
    catch (NullReferenceException)
                    {
                        
    throw new IndexOutOfRangeException("索引超出数组界限。");
                    }
                }
            }

            
    #endregion

            
    #region ICollection<T> 成员

            
    /// <summary>
            
    /// 向链表末尾,追加元素
            
    /// </summary>
            
    /// <param name="item">要追加的元素</param>
            public void Add(T item)
            {
                Node
    <T> p = new Node<T>(item);

                
    if (head == null)
                {
                    head 
    = p;

                    
    // 将这个节点设为末尾。
                    rear = p;

                    
    this.count = 1;
                    
    return;
                }

                rear.Next 
    = p;
                rear 
    = p;

                count
    ++;
            }

            
    /// <summary>
            
    /// 清空
            
    /// </summary>
            public void Clear()
            {
                head 
    = null;
                rear 
    = null;
            }

            
    /// <summary>
            
    /// 是否包含元素
            
    /// </summary>
            
    /// <param name="item">检查是否包含的元素</param>
            
    /// <returns>是否存在</returns>
            public bool Contains(T item)
            {
                
    int index = IndexOf(item);
                
    return (index != -1);
            }

            
    /// <summary>
            
    /// 将数据拷贝到数组
            
    /// </summary>
            
    /// <param name="array">准备的数组</param>
            
    /// <param name="arrayIndex">开始的索引</param>
            public void CopyTo(T[] array, int arrayIndex)
            {
                ArrayMode.CopyTo(array, arrayIndex);
            }

            
    /// <summary>
            
    /// 获得此链表的元素个数
            
    /// </summary>
            public int Count
            {
                
    get
                {
                    
    return GetCount();
                }
            }

            
    /// <summary>
            
    /// 获得是否是只读。
            
    /// </summary>
            public bool IsReadOnly
            {
                
    get
                {
                    
    return false;
                }
            }

            
    /// <summary>
            
    /// 删除元素
            
    /// </summary>
            
    /// <param name="item">将要被删除的元素</param>
            
    /// <returns>是否成功删除</returns>
            public bool Remove(T item)
            {
                Node
    <T> prev = null;
                Node
    <T> p = head;

                
    while (p != null)
                {
                    
    if (p.Data.Equals(item))
                    {
                        
    if (prev != null)
                            prev.Next 
    = p.Next;
                        
    else
                            head 
    = head.Next;

                        
    this.count--;
                        
    return true;
                    }
                    prev 
    = p;
                    p 
    = p.Next;

                }
                
    return false;
            }

            
    #endregion

            
    #region IEnumerable<T> 成员

            
    public IEnumerator<T> GetEnumerator()
            {
                
    throw new Exception("The method or operation is not implemented.");
            }

            
    #endregion

            
    #region IEnumerable 成员

            IEnumerator IEnumerable.GetEnumerator()
            {
                
    throw new Exception("The method or operation is not implemented.");
            }

            
    #endregion
        }
    }


  • 相关阅读:
    【分享】64K视频合集
    【原译】四种方法统计字符串的行数&执行时间比较
    【原译】自动省略功能的WPF文本框控件
    【笔记】MD5加密
    【原译】在amazon kindle上安装Metasploit
    【笔记】wubi安装ubuntu遇到的问题
    【笔记】贪心算法找零钱(C#实现)
    ubuntu下在java代码中调用c代码
    sql截取字段最后以特定字符隔开的内容语句
    mysql中删除字符串或字段中空格函数
  • 原文地址:https://www.cnblogs.com/end/p/1766390.html
Copyright © 2011-2022 走看看