数据结构 Via C# (2) 顺序存储结构的线性表

上文讲了一些数据结构的基本概念,现在开始进入正题,今天学习最简单的线性表,线性表分为顺序存储结构和链式存储结构,本文讲顺序存储结构的线性表。

 在C#的面向对象的世界中,我们一般都会对一个东西进行抽象,线性表的接口如下(只定义了一些最基本的操作,一些复杂的操作都是基于这些基本的操作组合实现的):

 

 /// <summary>
    ///     c#线性表接口
    /// </summary>
    public interface ICsharpList<T>
    {
        /// <summary>
        ///     指示线性表是否为空
        /// </summary>
        /// <returns></returns>
        bool IsListEmpty();
        /// <summary>
        ///     清空线性表
        /// </summary>
        void ClearList();
        /// <summary>
        ///     将第i个位置的元素返回
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        T GetItem(int i);
        /// <summary>
        ///     定位元素item在线性表中的位置,若不存在则返回-1
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        int LocateItem(T item);
        /// <summary>
        ///     在第i个位置插入元素item
        /// </summary>
        /// <param name="i"></param>
        /// <param name="item"></param>
        void ListInsert(int i, T item);
        /// <summary>
        ///     删除线性表第i个位置的元素,并返回该删除的元素
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        T ListDelete(int i);
        /// <summary>
        ///     获取线性表的长度
        /// </summary>
        /// <returns></returns>
        int ListLength();
    }

顺序存储结构的线性表实现如下:

/// <summary>
    ///     顺序存储结构线性表
    /// </summary>
    public class CsharpSqList<T> : ICsharpList<T>
    {
        /// <summary>
        ///     最大长度
        /// </summary>
        private readonly int _maxLength;
        /// <summary>
        ///     通过数组来实现顺序线性表
        /// </summary>
        public T[] Arrary { get; set; }
        /// <summary>
        ///     指示线性表的长度
        /// </summary>
        public int Length { get; set; }
        /// <summary>
        ///     构造函数
        /// </summary>
        /// <param name="maxLength"></param>
        public CsharpSqList(int maxLength)
        {
            _maxLength = maxLength;
            Arrary = new T[_maxLength];
        }
        /// <summary>
        ///     索引器
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
        public T this[int index]
        {
            get
            {
                if (index >= 0 && index <= _maxLength - 1) return Arrary[index];
                return default(T);
            }
            set
            {
                if (index >= 0 && index <= _maxLength - 1)
                    Arrary[index] = value;
            }
        }    
     /// <summary>
        ///     清空线性表
        /// </summary>
        /// <param name="index"></param>
        /// <returns></returns>
    public void ClearList()     {

        if (Length == 0)
           return;
        for (var i = 0; i < Length; i++)
        {
          Arrary[i] = default(T);
        }
        Length = 0;

        }
        /// <summary>
        ///     获取第i个元素
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        public T GetItem(int i)
        {
            if (IsListEmpty())
                throw new Exception("空线性表");
            if(i<0||i>Length-1)
                throw new Exception("非法参数");
            return Arrary[i];
        }
        /// <summary>
        ///     是否为空线性表
        /// </summary>
        /// <returns></returns>
        public bool IsListEmpty()
        {
            return Length == 0;
        }
        /// <summary>
        ///     删除第i个元素
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        public T ListDelete(int i)
        {
            if (IsListEmpty())
                throw new Exception("空线性表");
            if (i < 0 || i > Length - 1)
                throw new Exception("非法参数");
            var item = this[i];//保存被删除的元素
            if (i < Length - 1) //如果删除的元素不是最后一个则将后继的元素往前移动一步
            {
                for (var j = i; j < Length; j++)
                {
                    Arrary[j] = Arrary[j + 1];
                }
            }
            Length--;//将长度减一
            return item;
        }
        /// <summary>
        ///     插入一个元素到第i个位置
        /// </summary>
        /// <param name="i"></param>
        /// <param name="item"></param>
        public void ListInsert(int i, T item)
        {
            if(Length==_maxLength)
                throw new Exception("线性表已满");
            if(i<0||i>Length)
                throw new Exception("非法参数");
            if (i < Length - 1) //如果插入的元素不是最后一个则将后继的元素往后移动一步
            {
                for (var j = Length-1; j > i; j--)
                {
                    Arrary[j + 1] = Arrary[j];
                }
            }
            Arrary[i] = item;
            Length++;//长度加一
        }
        /// <summary>
        ///     获取长度
        /// </summary>
        /// <returns></returns>
        public int ListLength()
        {
            return Length;
        }
        /// <summary>
        ///     定位某个元素的第一个位置,若不存在则返回-1
        /// </summary>
        /// <param name="item"></param>
        /// <returns></returns>
        public int LocateItem(T item)
        {
            for (var i = 0; i < Length; i++)
            {
                if (Arrary[i].Equals(item))
                    return i;
            }
            return -1;
        }
    }

代码比较简单,就不一一解释了。

原文地址:https://www.cnblogs.com/aprilwarm/p/dataStructureViaCsharp2.html

时间: 2024-10-09 20:18:13

数据结构 Via C# (2) 顺序存储结构的线性表的相关文章

数据结构(三)——基于顺序存储结构的线性表

数据结构(三)--基于顺序存储结构的线性表 一.基于顺序存储结构的线性表实现 1.顺序存储的定义 线性表的顺序存储结构是用一段地址连续的存储单元依次存储线性表中的数据元素. 2.顺序存储结构的操作 使用一维数组实现顺序存储结构. template <typename T> class SeqList:public List<T> { protected: T* m_array;//顺序存储空间 int m_length;//当前线性表的长度 }; 一维顺序存储结构可以是原生数组或是

大话数据结构---顺序存储结构的线性表

线性表的定义:零个或多个数据元素的有限序列. 定义的解读: 首先是由一组数据元素组成,可以基本数据类型,也可以使自定义的类型, 有限的个数,当然可以是0个,也就是空表呗, 还有一个特点就是有序 这么一看线性表抽象出来就和生活中的排队一样,一群小朋友站成一队,每个人都知道自己站在第几个,自己的前面是谁,后面谁,除了排头排位的两个数据,每个数据都有唯一的前驱和后继. 线性表的分类 今天先学习一下顺序存储结构,顺序存储结构指的就是用一段地址连续的存储单元依次存储线性表的数据元素: 这么一看线性表挺像数

数据结构与算法 1 :基本概念,线性表顺序结构,线性表链式结构,单向循环链表

[本文谢绝转载] <大纲> 数据结构: 起源: 基本概念 数据结构指数据对象中数据元素之间的关系  逻辑结构 物理结构 数据的运算 算法概念: 概念 算法和数据结构区别 算法特性 算法效率的度量 大O表示法 时间复杂度案例 空间复杂度 时间换空间案例 1)线性表: 线性表初步认识: 线性表顺序结构案例 线性表顺序结构案例,单文件版 线性表的优缺点 企业级线性表链式存储案例:C语言实现 企业级线性表链式存储案例:C语言实现 单文件版 企业级线性表链式存储案例,我的练习  线性表链式存储优点缺点

数据结构(四)——基于链式存储结构的线性表

数据结构(四)--基于链式存储结构的线性表 一.基于链式存储结构的线性表 1.链式存储的定义 链式存储为了表示数据元素与其直接后继元素间的逻辑关系,数据元素除了存储本身的信息外,还需要存储直接后继的信息.相连的数据元素之间在存储空间中不要求连续.链式存储的逻辑结构基于链式存储结构的线性表中,每个结点都包含数据域和指针域.数据域用于存储数据元素本身,指针域用于存储相邻结点的地址. 2.链表的定义 链表是基于链式存储结构的线性表链表的基本元素:头结点:链表中的辅助结点,包含指向第一个数据元素的指针数

数据结构回顾之顺序存储结构中的线性表(栈与队列顺序线性表实现)

说到数据结构呢,对于一个Coder来说还是蛮重要的啦,每次看数据结构的东西都有新的收获,这两天在回顾数据结构的知识.当然啦,虽然数据结构有些是理论的东西,如果好好的理解数据结构的东西还是少不了的代码的支撑的.数据结构简单的来说吧,可以分为两大类,一个是数据的"物理存储结构",另一种是数据的"逻辑存储结构".数据的"物理存储结构"又可分为顺序的和链式的(下面将会结合着代码打印内存地址的形式来观察物理存储结构). 逻辑存储结构又可分为集合,线性, 树

数据结构:队列的顺序存储结构【转】

本文转载自:http://blog.csdn.net/jnu_simba/article/details/8841657 队列(Queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.是一种先进先出的线性表(FIFO).允许插入的一端称为队尾,允许删除的一端称为队头.我们在<栈的顺序存储结构>中发现,栈操作的top指针在Push时增大而在Pop时减小,栈空间是可以重复利用的,而队列的front.rear指针都在一直增大,虽然前面的元素已经出队了,但它所占的存储空间却不能重复利用

数据结构回顾之顺序存储结构中的线性表

说到数据结构呢,对于一个Coder来说还是蛮重要的啦,每次看数据结构的东西都有新的收获,这两天在回顾数据结构的知识.当然啦,虽然数据结构有些是理论的东西,如果好好的理解数据结构的东西还是少不了的代码的支撑的.数据结构简单的来说吧,可以分为两大类,一个是数据的“物理存储结构”,另一种是数据的“逻辑存储结构”.数据的“物理存储结构”又可分为顺序的和链式的(下面将会结合着代码打印内存地址的形式来观察物理存储结构). 逻辑存储结构又可分为集合,线性, 树,图这些东西. 数据结构说白了就是如何利用上面的那

线性表的顺序存储结构之顺序表类的实现_Java

在上一篇博文--线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构--顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放线性表的数据元素,元素在内存的物理存储次序与它们在线性表中的逻辑次序相同,即元素ai与其直接前驱ai-1及直接后继ai+1的存储位置相邻.顺序存储的线性表也成为顺序表(sequential list). 顺序表类SeqList提供线性表基于顺序存储结构的一种实现,它有两个私有成员变量table和n,

数据结构第六篇——顺序存储结构与链式存储结构的特点

?注:未经博主同意,不得转载. 两者特点: 顺序表的特点是逻辑上相邻的数据元素,物理存储位置也相邻,并且,顺序表的存储空间需要预先分配. 它的优点: (1)方法简单,各种高级语言中都有数组,容易实现. (2)不用为表示节点间的逻辑关系而增加额外的存储开销. (3)顺序表具有按元素序号随机访问的特点. 缺点: (1)在顺序表中做插入.删除操作时,平均移动表中的一半元素,因此对n较大的顺序表效率低. (2)需要预先分配足够大的存储空间,估计过大,可能会导致顺序表后部大量闲置:预先分配过小,又会造成溢