using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace DataStructure
{
class MySequenceList<T> : MyIList<T>
{
private int MAX;
private T[] data;
private int last; /// <summary>
/// 构造函数
/// </summary>
/// <param name="max"></param>
public MySequenceList(int max)
{
this.MAX = max;
data = new T[MAX];
last = -1;
} /// <summary>
/// 判断线性表是否为空
/// 如果顺序表的last为-1,则顺序表为空,返回true,否则返回false。
/// </summary>
/// <returns></returns>
public bool IsEmpty()
{
if (last == -1)
{
return true;
}
else
return false;
} /// <summary>
/// 附加操作
/// 附加操作是在顺序表未满的情况下,在表的末端添加一个新元素,然后使顺序表的last加1。
/// </summary>
/// <returns>附加是否成功</returns>
public bool Append(T t)
{
if (IsFull())
{
Console.WriteLine("Append Failed.It is Full!");
return false;
}
else
{
last++;
data[last] = t;
return true;
}
} /// <summary>
/// 判断顺序表是否为满
/// 如果顺序表为满,last等于maxsize-1,则返回true,否则返回false。
/// </summary>
/// <returns></returns>
public bool IsFull()
{
if (last == MAX - 1)
return true;
return false;
} /// <summary>
/// 求顺序表的长度
/// 由于数组是0基数组,即数组的最小索引为0,所以,顺序表的长度就是数组中最后一个元素的索引last加1。
/// </summary>
/// <returns></returns>
public int GetLength()
{
return last+1;
} /// <summary>
/// 打印顺序表
/// </summary>
public void PrintSqL()
{
if (IsEmpty())
{
Console.WriteLine("The SquenceList is Empty!");
return;
}
for (int i = 0; i <= last+1; i++)
{
Console.WriteLine(data[i]);
}
} /// <summary>
/// 清空操作
/// 清除顺序表中的数据元素是使顺序表为空,此时,last等于-1。
/// </summary>
public void Clear()
{
//data = new T[MAX];在教程上没有这一行,但是我认为不对!
data = new T[MAX];
last = -1;
} /// <summary>
/// 插入操作
/// 顺序表的插入是指在顺序表的第i个位置插入一个值为item的新元素,插入后使原表长为n的表(a1,a2,…,ai-1,ai,ai+1,…,an)成为表长为n+1的表(a1,a2,…,ai-1,item,ai,ai+1,…,an)。i的取值范围为1≤i≤n+1,i为n+1时,表示在顺序表的末尾插入数据元素。
/// (1)判断顺序表是否已满和插入的位置是否正确,表满或插入的位置不正确不能插入;
/// (2)如果表未满和插入的位置正确,则将an~ai依次向后移动,为新的数据元素空出位置。在算法中用循环来实现;
/// (3)将新的数据元素插入到空出的第i个位置上;
/// (4)修改last(相当于修改表长),使它仍指向顺序表的最后一个数据元素。
/// </summary>
/// <param name="t"></param>
/// <param name="i"></param>
public void Insert(T t,int index)
{
if (IsFull())
{
Console.WriteLine("Insert Failed.It is Full!");
}
else
{
//判断插入的位置是否正确,
// i小于1表示在第1个位置之前插入,
// i大于last+2表示在最后一个元素后面的第2个位置插入。
if (index < 1 || index > last + 2)
{
Console.WriteLine("Insert Failed.Position Error!");
return;
}
//last+1是该表最后一项的index
//last+2相当于加到表尾上面
if (index == last + 2)
{
data[last + 1] = t;
}
else
{
for (int i = last; i >= index - 1; i--)
{
data[i + 1] = data[i];
}
data[index - 1] = t;
}
last++; }
} /// <summary>
/// 删除操作
/// 顺序表的删除操作是指将表中第i个数据元素从顺序表中删除,删除后使原表长为n的表(a1,a2,…,ai-1,ai, ai+1,…,an)变为表长为n-1的表(a1,a2,…,ai-1,ai+1,…,an)。i的取值范围为1≤i≤n,i为n时,表示删除顺序表末尾的数据元素。
/// (1)判断顺序表是否为空和删除的位置是否正确,表空或删除的位置不正确不能删除;
/// (2)如果表未空和删除的位置正确,则将ai+1~an依次向前移动。在算法中用循环来实现;
/// (3)修改last(相当于修改表长),使它仍指向顺序表的最后一个元素。
/// </summary>
/// <param name="index">试图删除第几个元素</param>
/// <returns>是否删除成功</returns>
public bool Delete(int index)
{
if (IsEmpty())
{
Console.WriteLine("There is no item to delete!");
return false;
}
//判断删除的位置是否正确
// i小于1表示删除第1个位置之前的元素,
// i大于last+1表示删除最后一个元素后面的第1个位置的元素。
if (index < 1 || index > last + 1)
{
Console.WriteLine("Position is wrong!");
return false;
}
else
{
//同样适用于index=last+1
//相当于data[last]=defautl(T);
for (int i = index - 1; i <= last; i++)
{
data[i] = data[i + 1];
}
last--;
return true;
#region 推荐这样写,更有逻辑一点
////删除的是最后一个元素
//if (i == last + 1)
//{
// tmp = data[last--];
// return tmp;
//}
//else //删除的不是最后一个元素
//{
// //元素移动
// tmp = data[i - 1];
// for (int j = i; j <= last; ++j)
// {
// data[j] = data[j + 1];
// }
//}
#endregion
}
} /// <summary>
/// 取表元
/// 取表元运算是返回顺序表中第i个数据元素,i的取值范围是1≤i≤last+1。由于表是随机存取的,所以,如果i的取值正确,则取表元运算的时间复杂度为O(1)。
/// </summary>
/// <param name="index">取第几个元素</param>
/// <returns>获得这个元素</returns>
public T GetItem(int index)
{
//象这种表问题,首先要判断是否为空?是否为满?
if (IsEmpty())
{
Console.WriteLine("SquenceList is Empty!No Item to Get!");
//default(T) Obtain default value of type T
return default(T);
}
//然后判断参数的定义域是否符合条件
if (index < 1 || index > last + 1)
{
Console.WriteLine("GetItem Failed!Position Error");
return default(T);
}
else
{
return data[index-1];
}
} /// <summary>
/// 按值查找
/// 顺序表中的按值查找是指在表中查找满足给定值的数据元素。在顺序表中完成该运算最简单的方法是:从第一个元素起依次与给定值比较,如果找到,则返回在顺序表中首次出现与给定值相等的数据元素的序号,称为查找成功;否则,在顺序表中没有与给定值匹配的数据元素,返回一个特殊值表示查找失败。
/// </summary>
/// <returns>1.若能找到,返回第几个找到的2.否则返回-1</returns>
public int FindValueIndex(T t)
{
if (IsEmpty())
{
Console.WriteLine("list is Empty");
return -1;
}
for (int i = 0; i <= last; i++)
{
if (data[i].Equals(t))
{
return i+1;
}
}
return -1;
}
}
}

数据结构之顺序表,c#实现的更多相关文章

  1. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)

    基础数据结构——顺序表(2) Time Limit: 1000 MS    Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...

  2. [Python] 数据结构--实现顺序表、链表、栈和队列

    说明: 本文主要展示Python实现的几种常用数据结构:顺序表.链表.栈和队列. 附有实现代码. 来源主要参考网络文章. 一.顺序表 1.顺序表的结构 一个顺序表的完整信息包括两部分,一部分是表中元素 ...

  3. C++的标准模板库STL中实现的数据结构之顺序表vector的分析与使用

    摘要 本文主要借助对C++的标准模板库STL中实现的数据结构的学习和使用来加深对数据结构的理解.即联系数据结构的理论分析和详细的应用实现(STL),本文是系列总结的第一篇,主要针对线性表中的顺序表(动 ...

  4. [数据结构]C#顺序表的实现

    在数据结构的学习当中,想必C++可能是大家接触最多的入门语言了 但是C#的数据结构却很少看到,今天我写了一个C#顺序表的顺序存储结构 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是 ...

  5. 【PHP数据结构】顺序表(数组)的相关逻辑操作

    在定义好了物理结构,也就是存储结构之后,我们就需要对这个存储结构进行一系列的逻辑操作.在这里,我们就从顺序表入手,因为这个结构非常简单,就是我们最常用的数组.那么针对数组,我们通常都会有哪些操作呢? ...

  6. 数据结构:顺序表(python版)

    顺序表python版的实现(部分功能未实现) #!/usr/bin/env python # -*- coding:utf-8 -*- class SeqList(object): def __ini ...

  7. 数据结构4:顺序表(线性表的顺序存储结构)及C语言实现

    逻辑结构上呈线性分布的数据元素在实际的物理存储结构中也同样相互之间紧挨着,这种存储结构称为线性表的顺序存储结构. 也就是说,逻辑上具有线性关系的数据按照前后的次序全部存储在一整块连续的内存空间中,之间 ...

  8. Java——数据结构(顺序表)

    这是一个顺序表的类,初始化的时候就已经确定了表的长度,之后不能添加数据,因为使用的是数组存储的数据,不过这个表的类型是泛型的. public class List { private Object[] ...

  9. javascript数据结构之顺序表

    关于线性表的概念这里就不赘述了,可以自行百度和查阅资料,线性表按照存储(物理)结构分为顺序存储和链式存储,每种存储方式的不同决定了它的实现代码是不同的: 顺序存储的特点就是在内存中选一块连续的地址空间 ...

随机推荐

  1. MVC4.0系统开发新手历程(三)---数据导入计算

      数据导入计算 数据的重要意义就不需要我多说了吧,本项目中的数据来源是来自荆艺系统(熟悉物流报关的朋友应该知道)导出的一张Excel,包含了一段时间内整个公司所有销售的全部记录,保密级别那是杠杠的, ...

  2. 特征提取(Detect)、特征描述(Descriptor)、特征匹配(Match)的通俗解释

    特征匹配(Feature Match)是计算机视觉中很多应用的基础,比如说图像配准,摄像机跟踪,三维重建,物体识别,人脸识别,所以花一些时间去深入理解这个概念是不为过的.本文希望通过一种通俗易懂的方式 ...

  3. redis 学习笔记一

    找了半天,发觉还是redis的源码看起来比较舒服.所以决定今年把redis的源码读一遍顺便做个读书笔记.好好记录下.话说现在越来不越不愿意用脑袋来记录东西,喜欢靠note来记.话说这样不爱用脑会不会过 ...

  4. Hive 1、什么是Hive,Hive有什么用

    一.什么是Hive Hive是建立在 Hadoop 上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据 ...

  5. hdu 5410 CRB and His Birthday(混合背包)

    Problem Description Today is CRB's birthday. His mom decided to buy many presents for her lovely son ...

  6. css中的7中属性选择器

    在CSS的选择符中有七个属性选择符.它们分别是: 1.E[att] 选择具有att属性的E元素. 2.E[att="val"] 选择具有att属性且属性值等于val的E元素. 3. ...

  7. 常用的50条linux 命令

    从今天起,咱开始正式学习python了,于是遍整理了50条linux的常用命令. 1 线上查询帮助命令 :man   遇到什么不会的命令可以 man +你想要查询的命令 (需要有网),因为是英文的所以 ...

  8. 小结: Async & Await

    新项目组用到Async & Await, 关于Await会不会新开不开线程,遇到什么情况会新开线程的问题网上查了很多资料都没看到直观的解释.现简单总结一下. 直接上代码: namespace ...

  9. 自定义HttpHandler

    1.创建自定义类型 2.继承IHttpHandler接口,并实现 3.配置Web.Config文件,注册类型 4.访问 public class QuickMsgSatisticsHandler : ...

  10. Asus 安装 windows 7

    尊敬的华硕用户您好, 您是不是要让S400从usb和光驱启动呢.可以按如下步骤操作,1.开机的时候长按F2键进入BIOS界面,通过方向键进入[Boot]菜单,通过方向键选择[Lunch CSM]选项, ...