线性表之顺序表

来源:互联网 发布:二战德军军服 淘宝 编辑:程序博客网 时间:2024/05/16 05:23
1,什么是线性表
线性表就是关系中的一对一的关系,如果是一对多就用树来表示,如果多对多就用网状来表示。
线性表具有以下四个特征:
1> 有且只有一个“首”元素
2> 有且只有一个“尾”元素
3> 除“首”元素外,其余元素都有唯一的后继元素。
4> 除“尾”元素外,其余元素都有唯一的前驱元素。
2,线性表的两种存储结构
1> 顺序表,即线性表用顺序存储结构保存数据,数据是连续的。这一篇文章总结的就是顺序表

2> 链表,即线性表用链式存储结构保存数据,数据不连续。

3,顺序表的存储结构表示

4,顺序表的常见操作和代码实现

顺序表主要有以下常见操作,我们一般用数组来保存数据
1,初始化
思路:将数组的长度length设为0,时间复杂度为O(1)。
2,求顺序表的长度
思路:获取数组的length值,时间复杂度为O(1)。
3,插入元素
思路:分两种情况,一种是插入位置在数组的末尾,这种情况与添加元素相同。另一种情况是插入位置在数组的开始,这时候被插入元素的后续元素都要依次向后移动一位,也就是说整个数组都会移动,所以时间复杂度为O(n)。
4,删除元素
思路:同样分两种情况,一种是删除位置在数组的末尾,不用移动任何元素,因此时间复杂度为O(1);另一种情况是删除位置在数组的开始,这时被删除元素的后续元素都要依次向前移动一位,因此时间复杂度为O(n)。
5,按序号查找元素
思路:因为顺序表的存储地址是连续的,所以第n个元素的地址公式为:(n-1)*单元存储长度,不用移动任何元素,因此时间复杂度为O(1)。
6,按关键字查找元素
思路:一般用for循环,调用IComparable接口的CompareTo()方法去比较,因此时间复杂度为O(n)。

namespace DS.Model{    /// <summary>    /// 学生实体    /// </summary>    public class Student    {        public int ID { get; set; }        public string Name { get; set; }        public int Age { get; set; }    }}
namespace DS.BLL{    /// <summary>    /// 顺序表操作业务逻辑类    /// </summary>    public class SeqListBLL    {        /// <summary>        /// 初始化        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="seqListType"></param>        public static void InitSeqList<T>(SeqListType<T> seqList)        {            seqList.ListLen = 0;        }        /// <summary>        /// 获取顺序表的长度        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="seqList"></param>        /// <returns></returns>        public static int GetSeqListLen<T>(SeqListType<T> seqList)        {            return seqList.ListLen;        }        /// <summary>        /// 插入元素(在第n个元素之前的位置插入新元素)        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="seqList"></param>        /// <param name="n"></param>        /// <param name="data"></param>        /// <returns></returns>        public static bool Insert<T>(SeqListType<T> seqList, int n, T data)        {            //检查数组是否已满            if (seqList.ListLen >= seqList.MaxSize) return false;            //检查n的位置是否超出范围            if (n < 1 || n > seqList.ListLen + 1) return false;            //若插入数据位置不在表尾            if (n <= seqList.ListLen)            {                //将要插入位置之后元素依次向后移动一位                for (int i = seqList.ListLen - 1; i >= n-1; i--)                {                    seqList.ListData[i + 1] = seqList.ListData[i];                }            }            //将数据插入到位置为n的位置并将数组的长度加1            seqList.ListData[n-1] = data;            seqList.ListLen++;            return true;        }        /// <summary>        /// 删除元素(删除第n个元素)        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="seqList"></param>        /// <param name="n"></param>        /// <returns></returns>        public static bool Delete<T>(SeqListType<T> seqList, int n)        {            //判断数组是否为空            if (seqList.ListLen == 0) return false;            //判断n的位置是否合法            if (n < 1 || n > seqList.ListLen) return false;            //如果删除不是最后位置            if (n < seqList.ListLen)            {                //将删除位置后继元素依次前移                for (int i = n; i < seqList.ListLen; i++)                {                    seqList.ListData[i-1] = seqList.ListData[i];                }            }            //表长减1            seqList.ListLen--;            return true;        }        /// <summary>        /// 查找第n个元素        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="seqList"></param>        /// <param name="n"></param>        /// <returns></returns>        public static T GetDataByIndex<T>(SeqListType<T> seqList, int n)        {             //检查位置是否超出范围            if(n<1||n>seqList.ListLen) return default(T);            return seqList.ListData[n-1];        }        /// <summary>        /// 按关键字查找元素        /// </summary>        /// <typeparam name="T"></typeparam>        /// <typeparam name="W"></typeparam>        /// <param name="seqList"></param>        /// <param name="key"></param>        /// <param name="where"></param>        /// <returns></returns>        public static T GetDataByKey<T, W>(SeqListType<T> seqList,string key,Func<T,W> where) where W : IComparable        {            for (int i = 0; i < seqList.ListLen; i++)            {                if (where(seqList.ListData[i]).CompareTo(key) == 0)                {                     return seqList.ListData[i];                }            }            return default(T); //值类型返回0,引用类型返回null        }    }    /// <summary>    /// 封装顺序表    /// </summary>    /// <typeparam name="T"></typeparam>    public class SeqListType<T>    {        private const int maxSize = 100;        public int MaxSize { get { return maxSize; } }//表的最大长度        //初始化长度为100的数组保存数据        public T[] ListData = new T[maxSize];        //顺序表的长度        public int ListLen { get; set; }    }}



0 0