线性表之顺序表
来源:互联网 发布:二战德军军服 淘宝 编辑:程序博客网 时间:2024/05/16 05:23
1,什么是线性表
线性表就是关系中的一对一的关系,如果是一对多就用树来表示,如果多对多就用网状来表示。
线性表具有以下四个特征:
1> 有且只有一个“首”元素
2> 有且只有一个“尾”元素
3> 除“首”元素外,其余元素都有唯一的后继元素。
4> 除“尾”元素外,其余元素都有唯一的前驱元素。
2,线性表的两种存储结构
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
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- 《线性表之顺序表》
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- 线性表之顺序表
- SpringMVC中拦截/和拦截/*的区别
- [BZOJ2655] calc
- Java实现快速排序
- JS的事件监听机制
- Linux下的tar压缩解压缩命令详解
- 线性表之顺序表
- Volley源码阅读之网络分发器(NetworkDispatcher)的工作原理
- 一个java文件可以有多个类嘛?
- 杭电oj(Java版)——1017 A Mathematical Curiosity
- js用正则表达式获取地址栏参数
- Linux基本语法5
- Convert Sorted Array to Binary Search Tree
- 面向对象的三个特征
- Flink Scala API Extensions学习笔记以及翻译