• 单链表的实现


    //最近动手把单链表的操作实现了一遍:

    //单链表中存放的结点类:

        public class Node<T>
        {
            private T data;     //数据域
            private Node<T> next; //引用域
    
    
            //构造函数
            public Node(T val,Node<T> p)
            {
                data = val;
                next = p;
            }
    
    
            //构造函数
            public Node(T val)
            {
                data = val;
            }
    
    
            //构造函数
            public Node(Node<T> p)
            {
                next = p;
            }
    
            //构造函数
            public Node()
            {
                data = default(T);
                next = null;
            }
    
            //属性 data
            public T Data
            {
                get { return data; }
                set { data = value; }
            }
    
            //属性 next
            public Node<T> Next
            {
                get { return next; }
                set { next = value; }
            }
        }

    //单链表类 主要属性 是头引用 (头结点),所实现的接口如下:

     public interface IListDS<T>
        {
            //获取表的长度
            int GetLength();
            //清空表
            void Clear();
            //判断表是否为空
            bool IsEmpty();
            //向表尾追加
            void Append(T item);
            //在指定位置插入元素
            void Insert(T item, int i);
            //删除指定位置元素
            T Delete(int i);
            //获得在指定位置的元素
            T GetElem(int i);
            //获取元素在表中的位置
            int Locate(T value);
        }
    

    //具体的单链表类如下:

    public class LinkList<T> : IListDS<T>
        {
    
            //头引用
            public Node<T> head;
    
            //头引用属性
            public Node<T> Head
            {
                get
                {
                    return head;
                }
                set
                {
                    head = value;
                }
            }
    
    
            //构造函数
            public LinkList()
            {
                head = null;
            }
            
            //实现接口方法...
    
        
    }

    //具体的方法实现:

    1.//Is Empty //GetLength()//Clear()

    public bool IsEmpty()
    {
         return this.head == null;  
    }
    public int GetLength()  
    {
          if(IsEmpty())
          {
              return -1;
          }
          Node<T> p = head;  
          int j =1;
          while(p.Next!=null)
           {
                 p=p.Next;
                 ++j;
           }
           return j;
    }    

    public void Clear()
    {
      this.head = null;
    }

    //2.Append 向链表末尾追加结点

    public void Append(T item)
    {
      Node<T> target = new Node<T>(item);
      if(IsEmpty())
      {
        this.head = target;
        return;
      }
      Node<T> p = head;
      while(p.Next!=null)
      {
        p= p.Next;
      }
      p.Next = target;
    }

    //3.Insert 插入结点  有两种方式 在指定位置之前插入 和 在指定位置之后插入

      //3.1 在指定位置之前插入:

            public void Insert(T item, int i)
            {
                //    throw new NotImplementedException();
                if (IsEmpty() || i < 1)
                {
                    return;
                }
    
                if (i == 1)
                {
                    Node<T> q = new Node<T>(item);
                    q.Next = head;
                    head = q;
                    return;
                }
    
                Node<T> p = head;
                Node<T> r = new Node<T>();
    
                //r 存储第i个结点的前一个结点
                int j = 1;
                while (p.Next != null && j < i)
                {
                    r = p;
                    p = p.Next;
                    ++j;
                }
    
                if (j == i)
                {
                    Node<T> q = new Node<T>(item);
                    q.Next = p;
                    r.Next = q;
                }
    
            }

      //3.2在指定位置之后插入

     1      public void InsertAfter(T item,int i)
     2         {
     3             if (IsEmpty() || i < 1)
     4             {
     5                 return;
     6             }
     7 
     8             //首先找到第i个结点  和第i+1个结点(i.Next)
     9 
    10             Node<T> p = head;
    11             int j = 1;
    12 
    13             while (p.Next != null && j < i)
    14             {
    15                 p = p.Next;
    16                 ++j;
    17             }
    18 
    19 
    20             if (j == i )
    21             {
    22                 Node<T> target = new Node<T>(item);
    23                 target.Next = p.Next;
    24                 p.Next = target;
    25             }
    26 
    27         }

    //4.删除 第i个结点

     1        public T Delete(int i)
     2         {
     3             //
     4             //throw new NotImplementedException();
     5             if (IsEmpty() || i < 0)
     6             {
     7                 return default(T);
     8             }
     9 
    10             //记录到第i个结点
    11             Node<T> p = head;
    12 
    13             //记录第i-1个结点
    14             Node<T> q = new Node<T>();
    15 
          
             if(i==1)
              {
                q = head;
    head = q.Next;
                return q.Data;
              }


    16 int j = 1; 17 while (p.Next != null&& j<i) 18 { 19 q = p; 20 p = p.Next; 21 ++j; 22 } 23 24 if (j == i) 25 { 26 q.Next = p.Next; 27 return p.Data; 28 } 29 30 return default(T); 31 32 }

    //5.取表元 

    public T GetElem(int i)
    {
         if(IsEmpty()||i<1)
         {
            return default(T);
         }        
          if(i==1)
           {
              return head.Data;
           }
           Node<T> p = head;
           int j=1;
           while(p.Next!=null && j<i)       //先找到指定位置i的结点
           {
               p=p.Next;
               ++j;
           }
           if(j==i)
           {
               return p.Data;
           }
           return default(T);
    }        

    //6.Locate  //获取元素在表中的位置

    public int Locate(T item)
    {
          if(IsEmpty())
          return -1;
          Node<T> p = head;
          int j =1;
          while(p.Next!=null)
          {
               if(p.Data.Equals(item))
               break;
               p=p.Next;
               ++j;
          }    
          return j;
    }
  • 相关阅读:
    c++运算符优先级
    C++中宽字符类型(wchar_t)的编码
    标志寄存器综述
    ubuntu 更新源
    windows shell命令相关
    汇编语言-环境搭建(16位)
    linux配置ftp
    ssl协议相关
    boost相关
    ubuntu下编译protobuf
  • 原文地址:https://www.cnblogs.com/siyi/p/6515750.html
Copyright © 2020-2023  润新知