C#顺序表(数据结构)
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#顺序表(数据结构)的更多相关文章
- 【数据结构】之顺序表(Java语言描述)
之前总结过使用C语言描述的顺序表数据结构.在C语言类库中没有为我们提供顺序表的数据结构,因此我们需要自己手写,详细的有关顺序表的数据结构描述和C语言代码请见[我的这篇文章]. 在Java语言的JDK中 ...
- 数据结构Java实现02----线性表与顺序表
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)
基础数据结构——顺序表(2) Time Limit: 1000 MS Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...
- C# 数据结构 线性表(顺序表 链表 IList 数组)
线性表 线性表是最简单.最基本.最常用的数据结构.数据元素 1 对 1的关系,这种关系是位置关系. 特点 (1)第一个元素和最后一个元素前后是没有数据元素,线性表中剩下的元素是近邻的,前后都有元素. ...
- C:数据结构与算法之顺序表
顺序表作为数据结构的开端,说明这里面很多基础要学,初学者一开始都会混淆,今天我们来一步一步来建立一个完整的顺序表,可以任我们控制的顺序表,首先先定义一个顺序表 /* Note:Your choice ...
- C++数据结构学习之顺序表
顺序表是数据结构中最基本也是应用相当广泛的一种数据结构类型.它通常包含三个私有成分,即指向数据数组的头指针.当前表长以及表的实际容量.表的头指针通常指向数据数组的基地址,通过数组的形式进行访问数据数组 ...
- 数据结构Java实现01----线性表与顺序表
一.线性结构: 如果一个数据元素序列满足: (1)除第一个和最后一个数据元素外,每个数据元素只有一个前驱数据元素和一个后继数据元素: (2)第一个数据元素没有前驱数据元素: (3)最后一个数据元素没有 ...
- PHP数据结构之二 线性表中的顺序表的PHP实现
线性表 (一)基本特点:最基本.最简单.最常用的一种数据结构 在这种结构中: 1.存在一个唯一的被称为“第一个”的数据元素: 2.存在一个唯一的被称为“最后一个”的数据元素: 3.除第一个元素外,每个 ...
- SDUT OJ 数据结构上机测试1:顺序表的应用
数据结构上机测试1:顺序表的应用 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...
随机推荐
- PHP错误处理
错误的分类: 1.语法错误 2.运行时错误 3.逻辑错误 调试方法:1.注释法 2.输出法 error_reporting(E_ALL & ~E_NOTICE & ~E_WAR ...
- USB协议分析
一.USB设备描述结构 1.逻辑组织结构 在USB设备的逻辑组织中,包含设备.配置.接口和端点4个层次.设备通常有一个或多个配置,配置通常有一个或多个接口,接口有零或多个端点. 每个USB设备都可以包 ...
- 3.第一个python程序
学习任何一门语言的第一步,首先要写个'hello world',这算是程序员的一个传统.但在写之前,还有注意几个问题. 首先,python是一门脚本语言,而脚本语言的特点就是:我们写的代码会先由解释器 ...
- [terry笔记]Oracle会话追踪(二):TKPROF
接上一笔记[terry笔记]Oracle会话追踪(一):SQL_TRACE&EVENT 10046 http://www.cnblogs.com/kkterry/p/3279282.html ...
- JForum二次开发(一)
1.环境 myeclipse2014,jdk7,tomcat8,mysql5.6 2.下载源码地址 http://jforum.net/download.jsp 3.导入源码 新建web工程JForu ...
- Python脚本控制的WebDriver 常用操作 <六> 打印当前页面的title及url
下面将使用WebDriver来答应浏览器页面的title和访问的地址信息 测试用例场景 测试中,访问1个页面然后判断其title是否符合预期是很常见的1个用例: 假设1个页面的title应该是'hel ...
- Linux 虚拟机和物理机配互信出现无法连接
配置文件位置:[root@hank-yoon data]# vi /etc/ssh/sshd_configPermitRootLogin yes 在物理机中,装完系统,默认情况下PermitRootL ...
- 数据结构中的堆棧在C#中的实现
一.大致学习 堆棧是一种面向表的数据结构,堆棧中的数据只能在标的某一短进行添加和删除操作,是一种典型的(LIFO)数据结构. 现实生活中的理解:自助餐厅的盘子堆,人们总是从顶部取走盘子,当洗碗工把洗好 ...
- Oracle ODP.NET连接池
数据库连接池 连接池是数据库连接的缓存,每当应用程序需要连接数据库时向连接池申请数据库连接,连接池负责具体数据库连接的创建和销毁.连接池中的数据库连接会缓存一段时间,后续的连接请求首先使用缓存中的数据 ...
- 禁用DropDownList的Items
可以先看看效果,被禁用的DropDownList的Items已经无法选取与颜色也变为灰色. 刚开始,DropDownList没有接收从网址传来的参数时,它每一个Item都是可以选取的,一旦接收了值.所 ...