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. php使用base64加密解密图片

    php使用base64加密解密图片的实例代码. 例子: <?php //文件名:base64.php $data="/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAB ...

  2. js 月历 时间函数 月份第一天 星期的判断

    返回值为0-6,其中返回值0为星期天:如同,php中的日期函数一样判断.

  3. VC++ 在类中添加多线程操作

    CTestThread.h public: CTestThread(void); ~CTestThread(void); public: void setvalue(); static DWORD _ ...

  4. C# 页面抓取获取快递信息

    通过页面抓取信息可以获得很多我们想要的信息,比如现在常会用到的快递查询,主要抓取的网站为http://www.kuaidi100.com/ 通过IE的网络分析我们可以得到下面信息 通过对这个网站的分析 ...

  5. Android--Fragment的懒加载

    我们都知道,fragment放在viewPager里面,viewpager会帮我们预先加载一个,但是当我们要看fragment里面的内容时,我们也许只会去看第一个,不会去看第二个,如果这时候不去实现f ...

  6. hdu 4585 Shaolin

    原题链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=46093 #include<algorithm> #in ...

  7. UITabelView 高级(自定义Cell)

    自定义一个Cell 当我们要显示复杂数据的时候,例如要做一个扣扣聊天界面,或是新闻列表,系统的行已经不能满足我们的要求,这个时候我们可以通过自定义这个行,让他显示更多复杂结构的样式. 自定义cell就 ...

  8. iOS8 超简单的设置圆角按钮 ImageView等UIView

    button.layer.cornerRadius = // 这个值根据你想要的效果可以更改 button.clipsToBounds = true 这种方法不止可以设置按钮,UIView应该都可以设 ...

  9. swift 基于SDK8.0 获取当前时间

    var date = NSDate.date() var timeFormatter = NSDateFormatter() timeFormatter.dateFormat = "MM-d ...

  10. scjp考试准备 - 6 - 父类构造器的引用

    题一,如下代码的执行结果: class Person{ String name = "No name"; public Person(String nm){name = nm;} ...