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. WebApi接口开发

    文档 规范的文档对接口的开发有着至关重要的作用,规范的文档能够使 双方对接口的定义以及接口的参数都有一个明确的概念,便于沟通和联调. 在接口的开发过程中,为了保证传递参数的传递的私密性,参数传输是需要 ...

  2. [Qt] searchBox 搜索框实现

    [Qt] searchBox 搜索框实现 也就是在lineEdit中加入button.在搜索框的右边会有个小小的搜索图标,输入内容之后,搜索的图标会变成叉叉. 类中的IconHelper见我的另一篇博 ...

  3. python3-day4(递归)

    递归 特点 递归算法是一种直接或者间接地调用自身算法的过程.在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解. 递归算法解决问题的特点: (1) 递归就是在 ...

  4. BootStrap学习之先导篇——响应式网页

    Bootstrap学习之前,要知道响应式网页的原理. 1.什么是响应式网页? 一个页面,可以根据浏览设备的不同,以及特性的不同,而自动改变布局.大小等.使得在不同的设备上上都可以呈现优秀的界面. 优点 ...

  5. XAMPP安装及配置注意事项

    1.下载对应版本以后,解压安装 2.设置环境变量中的path,即D:\xampp\mysql\bin 3.设置监听端口 4.解决端口冲突问题 5.各种测试网址注意事项 由于很晚了,先记录下来,明天补充 ...

  6. windows 运行打开服务命令

    转载自:http://www.2cto.com/os/201209/157464.html windows运行打开服务命令 Java代码  1. gpedit.msc-----组策略  2. sndr ...

  7. Window vagrant 安装部署【转】

    回想以前,想要安装个虚拟机是多么的麻烦.先要费尽心机找到想要的操作系统镜像文件,然后安装虚拟化软件,按照其提供的GUI界面操作一步步创建,整个过程费时费力.但是,自从使用了Vagrant以后,咱腰不酸 ...

  8. [ES6] ITERATORS

    Iterables return an iterator object. This object knows how to access items from a collection 1 at a ...

  9. Android ActionBar应用实战,高仿微信主界面的设计

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/26365683 经过前面两篇文章的学习,我想大家对ActionBar都已经有一个相对 ...

  10. 如何把java代码转换成smali代码

    1.概述 Smali是Android系统中Dalvik虚拟机指令语言,在apk逆向过程中有许多工具可以把smali代码转化成java代码.但是在学习Smali语法的过程中,有时候需要进行java代码和 ...