zoukankan      html  css  js  c++  java
  • 线性表的实现

    实现线性表的基本操作,以c#接口的形式表示线性表,接口中的方法成员表示基本操作。为了,使线性表对任何数据类型都适用,数据元素的类型都使用泛型的类型参数。在实际创建线性表时,元素的实际类型可以用应用程序中任何方便的数据类型来代替,比如用简单的整型或者用户自定义的更复杂的类型来代替。

    线性表的接口如下所示:

     /// <summary>
        /// 线性表接口,使用泛型
        /// </summary>
        /// <typeparam name="T"></typeparam>
        public interface IListDS<T>
        {
            int GetLength();//求长度
            void Clear();//清空操作
            bool IsEmpty();//判断线性表表是否为空
            bool IsFull();//判断顺序表是否为满
            void Append(T item);//附加操作
            void Insert(T item, int i);//插入操作
            T Delete(int i);//删除操作
            T GetElem(int i);//去元素
            int Locate(T value);//按值查找 
            void showDataArray();//返回数组
            /// <summary>
            /// 将线性表元素进行倒置
            /// </summary>
            void Reverse();
    
        }

    线性表类SeqList<T>的实现如下:

    public class SeqList<T> : IListDS<T>
        {
            private int maxsize;//线性表的容量
            private T[] data;//数组,用于存储顺序表中的数据元素
            private int last;//指示顺序表最后一个元素的位置
    
            /// <summary>
            /// 索引器
            /// </summary>
            /// <param name="index"></param>
            /// <returns></returns>
            public T this[int index]
            {
                get
                {
                    return data[index];
                }
                set
                {
                    data[index] = value;
                }
            }
    
            /// <summary>
            /// 最后一个元素的位置属性
            /// </summary>
            public int Last
            {
                get
                {
                    return last;
                }
            }
            /// <summary>
            /// 容量属性
            /// </summary>
            public int Maxsize
            {
                get
                {
                    return maxsize;
                }
                set
                {
                    maxsize = value;
                }
            }
    
            public SeqList(int size)
            {
                data = new T[size];
                maxsize = size;
                last = -1;
            }
    
            public int GetLength()
            {
                return last + 1;
            }
    
            public void Clear()
            {
                last = -1;
    
            }
    
            public bool IsEmpty()
            {
                if (last != -1)
                    return false;
                return true;
            }
    
            public bool IsFull()
            {
                if (last == maxsize - 1)
                    return true;
                else
                    return false;
            }
    
    
            public void Append(T item)
            {
                if (IsFull())
                {
                    Console.WriteLine("List is full");
                    return;
                }
                else
                {
                    data[++last] = item;
                }
    
            }
    
            public void Insert(T item, int i)
            {
                if (IsFull())
                {
                    Console.WriteLine("List is full");
                    return;
                }
                else if (i < 1 || i > last + 2)
                {
                    Console.WriteLine("Position is error");
                    return;
                }
                if (i == last + 2)//在顺序表的表尾插入元素
                {
                    data[i-1] = item;
                }
                else
                {
                    //在其他位置插入元素
                    //元素移动
                    for (int j = last; j >= i - 1; --j)
                    {
                        data[j + 1] = data[j];
                    }
                    //将新的元素插入第i个位置上
                    data[i-1] = item;
                }
                //修改表长
                ++last;
            }
    
            public T Delete(int i)
            {
                T tmp = default(T);
                //判断表是否为空
                if (IsEmpty())
                {
                    Console.WriteLine("List is empty");
                    return tmp;
                }
                if (i < 1 || i > last + 1)
                {
                    Console.WriteLine("Position is error!");
                    return tmp;
                }
                //删除的是最后一个元素
                if (i == last + 1)
                {
                    tmp = data[last--];
                    data[i-1] = default(T);
                    return tmp;
                }
                else//删除的不是最后一个元素
                {
                    tmp = data[i - 1];
                    for (int j = i-1; j <=last; ++j)
                    {
                        data[j] = data[j + 1];
                    }
                }
                --last;
                return tmp;
            }
    
            public T GetElem(int i)
            {
                if (IsEmpty() || i < 1 || i > last + 1)
                {
                    Console.WriteLine("List is empty or position is error!");
                    return default(T);
                }
                return data[i-1];
            }
    
            public int Locate(T value)
            {
                if (IsEmpty())
                {
                    Console.WriteLine("List is empty!");
                    return -1;
                }
                int i = 0;
                for ( i = 0; i <= last; i++)
                {
                    if(value.Equals(data[i]))
                    break;
                }
                if(i>last)
                    return -1;
                return i;
    
            }
    
    
            public void showDataArray()
            {
                Console.WriteLine("dataArray item is:");
                foreach (T i in data)
                {
                    Console.Write(i + " ");
                }
                Console.WriteLine();
            }
    
    
           public void Reverse()
           {
               T tmp = default(T);
               int len = GetLength()-1;
               for (int i = 0; i<=len / 2; ++i)
               {
                   tmp = data[i];
                   data[i] = data[len - i];
                   data[len - i] = tmp;
               }
           }
    
        }

    主函数简单的调用:

     static void Main(string[] args)
            {
                IListDS<int> list = new SeqList<int>(5);
    
                list.Append(1);
                list.Append(2);
                list.Append(3);
                list.Append(4);
                list.Append(5);
                //list.Append(6);
               // int length = list.GetLength();
               // Console.WriteLine("the length is:"+length);
               // list.dataArray();
               // Console.WriteLine("Insert array operate");
               // list.Insert(4, 4);
               // Console.WriteLine("After insert the length is:" + list.GetLength());
               // list.dataArray();
               // Console.WriteLine("Delete operate");
               // Console.WriteLine("After Delete the length is:" + list.GetLength());
               //int d= list.Delete(3);
               //Console.WriteLine("删除的元素为:"+d);
               // list.dataArray();
    
                list.showDataArray();
                list.Reverse();
                list.showDataArray();
                Console.ReadKey();
            }

  • 相关阅读:
    leetcode-----118. 杨辉三角
    leetcode-----117. 填充每个节点的下一个右侧节点指针 II
    leetcode-----116. 填充每个节点的下一个右侧节点指针
    leetcode-----115. 不同的子序列
    leetcode-----114. 二叉树展开为链表
    leetcode-----113. 路径总和 II
    leetcode-----112. 路径总和
    leetcode-----111. 二叉树的最小深度
    windows同时安装jdk7和jdk8
    使用乌龟Git连接github
  • 原文地址:https://www.cnblogs.com/bianlan/p/2714759.html
Copyright © 2011-2022 走看看