• 用C#学习数据结构之线性表


    什么是线性表

     线性表是最简单、最基本、最常用的数据结构。线性表是线性结构的抽象(Abstract),线性结构的特点是结构中的数据元素之间存在一对一的线性关系。这种一对一的关系指的是数据元素之间的位置关系,即:(1)除第一个位置的数据元素外,其它数据元素位置的前面都只有一个数据元素;(2)除最后一个位置的数据元素外,其它数据元素位置的后面都只有一个元素。也就是说,数据元素是一个接一个的排列。因此,可以把线性表想象为一种数据元素序列的数据结构。


    线性表的接口定义

     1 public interface IListDS<T> {
     2     int GetLength(); //求长度
     3     void Clear(); //清空操作
     4     bool IsEmpty(); //判断线性表是否为空
     5     void Append(T item); //附加操作
     6     void Insert(T item, int i); //插入操作
     7     T Delete(int i); //删除操作
     8     T GetElem(int i); //取表元
     9     int Locate(T value); //按值查找
    10 }

    顺序表类SeqList<T>的实现

    public class SeqList<T> : IListDS<T>
        {
            private int maxsize; //顺序表的容量
            private T[] data; //数组,用于存储顺序表中的数据元素
            private int last; //指示顺序表最后一个元素的位置
    
            //索引器
            public T this[int index]
            {
                get
                {
                    return data[index];
                }
                set
                {
                    data[index] = value;
                }
            }
    
            //最后一个数据元素位置属性
            public int Last
            {
                get
                {
                    return last;
                }
            }
    
            //容量属性
            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 true;
                }
                else
                {
                    return false;
                }
            }
    
            //判断顺序表是否为满
            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;
                }
                data[++last] = item;
            }
    
            //在顺序表的第i个数据元素的位置插入一个数据元素
            public void Insert(T item, int i)
            {
                if (IsFull())
                {
                    Console.WriteLine("List is full");
                    return;
                }
                if (i < 1 || i > last + 2)
                {
                    Console.WriteLine("Position is error!");
                    return;
                }
                if (i == last + 2)
                {
                    data[last + 1] = item;
                }
                else
                {
                    for (int j = last; j >= i - 1; --j)
                    {
                        data[j + 1] = data[j];
                    }
                    data[i - 1] = item;
                }
                ++last;
            }
    
            //删除顺序表的第i个数据元素
            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--];
                }
                else
                {
                    tmp = data[i - 1];
                    for (int j = i; j <= last; ++j)
                    {
                        data[j] = data[j + 1];
                    }
                }
                --last;
                return tmp;
            }
    
            //获得顺序表的第i个数据元素
            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];
            }
    
            //在顺序表中查找值为value的数据元素
            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;
            }
        }        
  • 相关阅读:
    Poj2104-K-th Number(主席树)
    Poj3237-Tree(树链剖分)
    Spoj QTREE(树链剖分)
    字符串算法
    网络流算法
    利用DiDiSoft OpenPGP Library for .NET 程序加密解密文件
    利用GPG4Win加密解密文件
    .NET Standard和.NET Framework的区别【转】
    Aras学习笔记 (6) Aras Client Side代码弹出标准ItemType内容窗口
    WebClient使用DownloadFile下载文件超时的解决办法
  • 原文地址:https://www.cnblogs.com/lizhizhang/p/5299915.html
Copyright © 2020-2023  润新知