c# 线性表

线性表的形式化定义为:线性表(List)简记为L,是一个二元组,
L = (D, R)
其中:D是数据元素的有限集合。
R是数据元素之间关系的有限集合。

  1. 1线性表的基本操作

    C#接口的形式表示线性表,接口中的方法成员表示基本操作。并且,为了使线性表对任何数据类型都适用,数据元素的类型使用泛型的类型参数。在实际创建线性表时,元素的实际类型可以用应用程序中任何方便的数据类型来代替,比如用简单的整型或者用户自定义的更复杂的类型来代替。
    线性表的接口如下所示。

public interface IListDS<T> {
int GetLength();    //求长度
void Clear();       //清空操作
bool IsEmpty();     //判断线性表是否为空
void Append(T item); //附加操作
void Insert(T item, int i); //插入操作
T Delete(int i);    //删除操作
T GetElem(int i);   //取表元
int Locate(T value); //按值查找
}
  1. 2 顺序表的定义
    把表中的元素一个接一个地放进顺序的存储单元,这就是线性表的顺序存储(Sequence Storage)。线性表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素,用这种方式存储的线性表叫顺序表(Sequence List).
    这里写图片描述
    假设顺序表中的每个数据元素占w个存储单元,设第i个数据元素的存储地址为Loc(ai),则有:
    Loc(ai)= Loc(a1)+(i-1)*w 1≤i≤n

把顺序表看作是一个泛型类,类名叫SeqList。”Seq”是英文单词”Sequence”的前三个字母。SeqList类实现了接口IListDS。用数组来存储顺序表中的元素,在SeqList类中用字段data来表示。由于经常需要在顺序表中插入或删除数据元素,所以要求顺序表的表长是可变的。因此,数组的容量需要设计得特别大,可以用System.Array的Length属性来表示。但为了说明顺序表的最大长度(顺序表的容量),在SeqList类中用字段maxsize来表示。maxsize的值可以根据实际需要修改,这通过SeqList类中构造器的参数size来实现。顺序表中的元素由data[0]开始依次顺序存放,由于顺序表中的实际元素个数一般达不到maxsize,因此,在SeqList类中需要一个字段last表示顺序表中最后一个数据元素在数组中的位置。如果顺序表中有数据元素时,last的变化范围是0到maxsize-1,如果顺序表为空,last=-1。由于顺序表空间的限制,当往顺序表中插入数据元素需要判断顺序表是否已满,顺序表已满不能插入元素。所以,SeqList类除了要实现接口IListDS中的方法外,还需要实现判断顺序表是否已满等成员方法。

*顺序表类SeqList<T>的实现说明如下所示*。
public class SeqList<T> : IListDS<T> {
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 SeqList(int size)
{
data = new T[size];
maxsize = size;
last = -1;
}
//求顺序表的长度
public int GetLength()
{
return last+1;   
//last ==-1;SeqList 表 是空
//last的变化范围是0到maxsize-1
// 所以 last+1 == GetLength();
}
//清空顺序表
public void Clear()
{
last = -1;
}
//判断顺序表是否为空
//如果顺序表的last为-1,则顺序表为空,返回true,否则返回false。
public bool IsEmpty()
{
if (last == -1)
{
return true;
}
else
{
return false;
}
}
//判断顺序表是否为满
//如果顺序表为满,last等于maxsize-1,则返回true,否则返回false。
public bool IsFull()
{
if (last == maxsize-1)
{
return true;
}
else
{
return false;
}
}
//在顺序表的末尾添加新元素
//附加操作是在顺序表未满的情况下,在表的末端添加一个新元素,然后使顺序表的last加1。
public void Append(T item)
{
if(IsFull())
{
Console.WriteLine("List is full");
return;
}
data[++last] = item;
}
//在顺序表的第i个数据元素的位置插入一个数据元素
/*顺序表的插入是指在顺序表的第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(相当于修改表长),使它仍指向顺序表的最后一个数据元素。*/
public void Insert(T item, int i)
{
if (IsFull())
{
Console.WriteLine("List is full");
return;
}
//1≤i≤n  i表示第i个数据元素的存储地址
//i小于1表示在第1个位置之前插入,
// i大于last+2表示在最后一个元素后面的第2个位置插入
if(i<1 || i>last+2)
{
Console.WriteLine("Position is error!");
return;
}
if (i == last + 2)
{
//在顺序表的末尾插入i
data[last+1] = item;
}
else
{
for (int j = last; j>= i-1; --j)
{
//第i-1后面的值 都要向后移动一位
data[j + 1] = data[j];
}
//在顺序表的第i个位置前插入
data[i-1] = item;
}
//链表 长度+1
++last;
}
//删除顺序表的第i个数据元素
/*顺序表上删除一个数据元素的步骤如下:
(1)判断顺序表是否为空和删除的位置是否正确,表空或删除的位置不正确不能删除;
(2)如果表未空和删除的位置正确,则将ai+1~an依次向前移动。在算法中用循环来实现;
(3)修改last(相当于修改表长),使它仍指向顺序表的最后一个元素。*/
public T Delete(int i)
{
T tmp = default(T);
if (IsEmpty())
{
Console.WriteLine("List is empty");
return tmp;
}
if (i < 1 || i > last+1)
{
Console.WriteLine("Position is error!");
return tmp;
}
if (i == last+1)
{
tmp = data[last--];
}
else
{
tmp = data[i-1];
for (int j = i; j <= last; ++j)
{
data[j] = data[j + 1];
}
}
--last;
return tmp;
}
//获得顺序表的第i个数据元素
public T GetElem(int i)
{
if (IsEmpty() || (i<1) || (i>last+1))
{
Console.WriteLine("List is empty or Position is error!");
return default(T);
}
return data[i-1];
}
//在顺序表中查找值为value的数据元素
public int Locate(T value)
{
if(IsEmpty())
{
Console.WriteLine("List is Empty!");
return -1;
}
int i = 0;
for (i = 0; i <= last; ++i)
{
if (value.Equals(data[i]))
{
break;
}
}
if (i > last)
{
return -1;
}
return i;
}
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值