xmfdsh我近来心情实在不好,只因为这两天课比较少,然后一下子时间太多,不知道干什么,心情郁闷。。。。。。这是要闹哪样?这都让我一个郁闷了一个晚上。闲来无聊,回顾下之前学的C#数据结构,数据结构的重要性无论是对于哪门语言都是很必要也很重要的,课程中老师教的C语言,然后我自己自学的C#,再自学了C#的数据结构,对比了下,发现C,C++这些有着指针,比较低级点的语言,写起数据结构更加能考验一个人的思维,C#作为一门高级语言,也是有着自己一套数据结构的,这些更深层次的对比等我都学了比较精通再来慢慢对比吧。

附上整个项目的源码:http://files.cnblogs.com/xmfdsh/%E9%A1%BA%E5%BA%8F%E8%A1%A8.rar

今天的主题:顺序表

在计算机内,保存线性表最简单的方式,就是把表中的元素一个接着一个地放进顺序的存储单元,这就是线性表的顺序存储。线性表的顺序存储是指在内存中用一块地址连续的空间一次存放线性表的数据元素,用这种方式存储的线性表叫顺序表。

由于只考虑到线性表的基本操作,所以以C#接口的形式表示线性表,接口中的方法成员表示基本操作,为了使线性表对任何数据类型都使用,数据元素的类型使用泛型的类型参数

线性表的接口如下表述:

public interface IListDS<T>
{
//求长度
int GetLength();
//清空
void Clear();
//判断线性表是否为空
bool IsEmpty();
//判断线性表是否为满
bool IsFull();
//附加操作
void Append(T item);
//插入
void Insert(T item, int i);
//删除
T Delete(int i);
//取表元
T GetElem(int i);
//按值查找
int Locate(T value);
}

接下来就是定义一个类来实现这些接口,首先今天讲的既然是顺序表的话,那么我定义一个ListDS类,来实现这些接口,在那之前先在顺序表中定义几个参数,和实现这些参数的属性:

        private int maxsize;//顺序表容量
private T[] data;//数组,存放数据元素
private int last;//最后一个元素位置 //索引器
public T this[int index]
{
get
{
return data[index];
}
set
{
data[index] = value;
}
}
//最后一个数据元素位置
public int Last
{
get
{
return last;
}
}
//容量属性
public int Maxsize
{
get
{
return maxsize;
}
set
{
maxsize = value;
}
}
//构造函数
public ListDS(int size)
{
data = new T[size];
maxsize = size;
last = -;
}

接下来便是实现这些接口了,方法很简单,既然是数组的话,没有指针什么的,就没有什么难度,像之前学C一样很直接的方式:

//---------------------------------------一下实现接口方法------------------------------------
//获取长度
public int GetLength()
{
return last + ;
}
//清空操作
public void Clear()
{
last = -;
}
//判断是否为空
public bool IsEmpty()
{
if (last == -)
return true;
else
return false;
}
public bool IsFull()
{
if (last == maxsize - )
return true;
else
return false;
}
//顺序表末尾附加新元素操作
public void Append(T item)
{
if(IsFull())
{
Console.WriteLine("顺序表已经满");
return;
}
data[++last] = item;
}
//在顺序表第i位置插入一个数据元素
public void Insert(T item, int i)
{
if(IsFull())
{
Console.WriteLine("顺序表已经满");
return;
}
if(i<||i>last+)
{
Console.WriteLine("插入位置错误,不允许");
return;
}
if(i==last+)
{
data[++last] = item;
}
else
{
for(int j=last;j>=i-;j--)
{
data[j + ] = data[j];
}
data[i - ] = item;
last++;
}
}
//删除
public T Delete(int i)
{
T temp = default(T);
if(IsEmpty())
{
Console.WriteLine("集合为空");
return temp;
}
if(i<||i>last+)
{
Console.WriteLine("删除位置错误,不允许");
return temp;
}
if(i==last+)
{
temp = data[last--];
}
else
{
temp = data[i - ];
for(int j=i;j<=last;j++)
{
data[j-] = data[j];
}
--last;
}
return temp;
}
//根据id获取数据元
public T GetElem(int i)
{
if(IsEmpty()||(i<)||(i>last+))
{
Console.WriteLine("获取数据的位置错误,不允许");
return default(T);
}
return data[i - ];
}
//根据数据查找 对应的位置
public int Locate(T value)
{
if(IsEmpty())
{
Console.WriteLine("顺序表为空");
return -;
}
int i = ;
for(i=;i<=last;i++)
{
if (value.Equals(data[i]))
break;
}
if(i>last)
{
return -;
}
return i; }

接下来整个数据结构就基本实现了,那么那些实现的菜单和测试的方法我就不写了,再做几道经典的题目吧,首先,就是顺序表倒置,很简单,其实就是泛型的T不一样:

//----------------------------------------顺序表扩展方法----------------------------------------------
/// <summary>
/// 顺序表倒置
/// </summary>
/// <param name="L"></param>
public void ReverListDS()
{
T temp = default(T);
int len = GetLength();
for(int i=;i<=len/;i++)
{
temp = data[i];
data[i] = data[len - i];
data[len - ] = temp;
}
}

第二题:按升序 合并两个表(只限int类型),这里还是可以不一定要限制int类型的,有兴趣的可以去尝试一下,我就拿之前C的最简单的int类型来操作

        /// <summary>
/// 按升序 合并两个表(只限int类型)
/// </summary>
/// <param name="La"></param>
/// <param name="Lb"></param>
/// <returns></returns>
public ListDS<int> Merge(ListDS<int> La,ListDS<int> Lb)
{
ListDS<int> Lc = new ListDS<int>(La.maxsize + Lb.maxsize);
int i = ;
int j = ;
int k = ;
//两个表中都有数据元素
while((i<=(La.GetLength()-))&&(j<=(Lb.GetLength()-)))
{
if(La[i]<Lb[j])
{
Lc.Append(La[i++]);
}
else
{
Lc.Append(Lb[j++]);
}
}
//a表中剩余的元素
while(i<=(La.GetLength()-))
{
Lc.Append(La[i++]);
}
//b表中剩余的元素
while(j<(Lb.GetLength()-))
{
Lc.Append(Lb[j++]);
}
return Lc;
}

第三题:构造顺序表Lb,只包含La中所有值不相同元素(以int类型为例)

        /// <summary>
/// 构造顺序表Lb,只包含La中所有值不相同元素(以int类型为例)
/// </summary>
/// <param name="La"></param>
/// <returns></returns>
public ListDS<int> Purge(ListDS<int> La)
{
ListDS<int> Lb = new ListDS<int>(La.Maxsize);
Lb.Append(La[]);
for(int i=;i<La.GetLength();i++)
{
int j = ;
for(j=;j<Lb.GetLength()-;j++)
{
if(La[i].CompareTo(Lb[j])==)
{
break;
}
}
if(j>=Lb.GetLength()-)
{
Lb.Append(La[i]);
}
}
return Lb;
}

好,顺序表就这样完成了,一下子心情大好,在码这些数据结构的时候,xmfdsh一直在思考,不仅仅思考这个数据结构,更多的是为什么今天会如此焦虑,如此慌乱,明明那么多东西要做,那么多东西要学,当时间来的时候,为什么一下子迷茫到不知道学点什么,一个晚上,xmfdsh终于得出了自己的结论,尽管asp.net 的MVC已经算入门,而且很喜欢,但是asp.net的基础还不是很牢固,更应该去好好学习(昨晚一位师兄突然问我asp.net学的怎样,想给我项目的样子),自己都觉得学无止境啊,另外,发现心情不好的时候码一下代码,竟然能有这等效果,该不会我已经屌丝到这种地步了吧,哈哈哈哈,以后每个星期学一种数据结构或者一种算法,就这么决定了。

C#顺序表(数据结构)的更多相关文章

  1. 【数据结构】之顺序表(Java语言描述)

    之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...

  2. 数据结构Java实现02----线性表与顺序表

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

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

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

  4. C# 数据结构 线性表(顺序表 链表 IList 数组)

    线性表 线性表是最简单.最基本.最常用的数据结构.数据元素 1 对 1的关系,这种关系是位置关系. 特点 (1)第一个元素和最后一个元素前后是没有数据元素,线性表中剩下的元素是近邻的,前后都有元素. ...

  5. C:数据结构与算法之顺序表

    顺序表作为数据结构的开端,说明这里面很多基础要学,初学者一开始都会混淆,今天我们来一步一步来建立一个完整的顺序表,可以任我们控制的顺序表,首先先定义一个顺序表 /* Note:Your choice ...

  6. C++数据结构学习之顺序表

    顺序表是数据结构中最基本也是应用相当广泛的一种数据结构类型.它通常包含三个私有成分,即指向数据数组的头指针.当前表长以及表的实际容量.表的头指针通常指向数据数组的基地址,通过数组的形式进行访问数据数组 ...

  7. 数据结构Java实现01----线性表与顺序表

    一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有 ...

  8. PHP数据结构之二 线性表中的顺序表的PHP实现

    线性表 (一)基本特点:最基本.最简单.最常用的一种数据结构 在这种结构中: 1.存在一个唯一的被称为“第一个”的数据元素: 2.存在一个唯一的被称为“最后一个”的数据元素: 3.除第一个元素外,每个 ...

  9. SDUT OJ 数据结构上机测试1:顺序表的应用

    数据结构上机测试1:顺序表的应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...

随机推荐

  1. Using-jqGrid-s-search-toolbar-with-multiple-filter

    http://www.codeproject.com/Articles/58357/Using-jqGrid-s-search-toolbar-with-multiple-filter

  2. Delphi CxGrid 汇总(4)

    1.     CxGrid汇总功能 ① OptionsView-Footer设置为True,显示页脚   ② CxGrid的Summary选项卡定义要汇总的列和字段名及汇总方式,Footer选项卡定义 ...

  3. [转]SQLServer 2008以上误操作数据库恢复方法——日志尾部备份

    原文出处:http://blog.csdn.net/dba_huangzj/article/details/8491327 问题: 经常看到有人误删数据,或者误操作,特别是update和delete的 ...

  4. WPF Event 在 Command 中的应用初级篇,支持所有Event 展示松耦合设计的全部代码 - 解决TextBoxBase.TextChanged或者TextBox.TextChanged等类似事件绑定问题。

    做过WPF开发的人,都知道做MVVM架构,最麻烦的是Event的绑定,因为Event是不能被绑定的,同时现有的条件下,命令是无法替代Event.而在开发过程中无法避免Event事件,这样MVVM的架构 ...

  5. JavaWeb之 JSP基础

    什么是JSP JSP的全称是java server page, java服务页面.是提供java服务的页面~ 那么和Servlet有什么区别呢?JSP的页面既可以写java代码~也可以写html代码哦 ...

  6. poj 1985 Cow Marathon

    题目连接 http://poj.org/problem?id=1985 Cow Marathon Description After hearing about the epidemic of obe ...

  7. git的初步使用

    1.在GitHub上建立项目登录GitHub后,你可以在右边靠中那里找到一个按钮“New Repository”,点击过后,填入项目名称.说明和网址过后就可以创建了,然后会出现一个提示页面,记下类似g ...

  8. maven学习手记 - 2

    学习目标 maven 的插件和目标: maven 的生命周期和阶段.   前言 在手记1中看到执行 mvn clean package 时,maven 自动执行了compile 和 test 操作. ...

  9. FPGA---ucf文件编写

    摘要:本文主要通过一个实例具体介绍ISE中通过编辑UCF文件来对FPGA设计进行约束,主要涉及到的约束包括时钟约束.群组约束.逻辑管脚约束以及物理属性约束. Xilinx FPGA设计约束的分类 Xi ...

  10. Objective-C面向对象(一)

    1.类和对象 1.1定义类 面向对象的程序设计中有两个重要概念:类(class)和对象(object),类事某一批对象的抽象,对象是一个具体存在的实体. Objective-C定义类需要氛围2个步骤 ...