您的位置:首页 > 理论基础 > 数据结构算法

数据结构笔记2 线性表之顺序表

2009-07-06 16:31 302 查看

什么是线性表?

线性表(LinearList)是由n(n≥0)个数据元素(结点)a1,a2,…,an组成的有限序列。

顺序表的特点:

容量固定

访问速度快

线性表的顺序存储结构在c#中最直接表现形式就是数组。数组是最基础也是存取速度最快的一种集合类型。

在托管堆中创建数组时,除了数组元素,数组对象所占用的内存块还包括类型对象指针、同步索引等额外成员!

数组虽然有很多优点,但是它无法进行添加和删除,也无法动态的更改集合的大小

如果要动态的改变数组所占用的空间的大小,可以使用c#中的ArrayList。动态数组。


线性顺序表的操作:

插入:
通常将增加的内容加在顺序表的最后一个,但是如果要求按顺序插入时则应该先查找应该插入的位置在将该位置以后的顺序表的所有内容均向后移动,再将需要插入的内容插入相应位置。

要注意的问题是:
(1)顺序表中数据区域有MAXLEN个存储单元,所以在插入时先检查顺序表是否已满,在表满的情况下不能再做插入,否则产生溢出错误。
(2)检验插入位置的有效性,这里i的有效范围是:1<=i<=n+1,其中n为原表长。
(3)注意数据的移动方向,必须从原线性表最后一个结点(an)起往后移动。顺序表插入操作需移动表中一半数据元素,其时间复杂度为O(n)。

删除:
先查找应该删除内容的位置,在将该位置以后的顺序表的所有内容均向前移动,需要删除的内容就自动被删除了

请注意以下问题:
(1)首先要检查删除位置的有效性,删除第i个元素,i的取值为:1<=i<=n。
(2)当表空时不能做删除,因表空时L->last的值为-1,条件(i<1||i>L->last+1)也包括了对表空的检查。
(3)删除ai之后,该数据则已不存在,如果需要,必须先取出ai后,再将其删除。


优缺点:

顺序存储的优点:

•可以随机存取表中任意一个元素;

•存储位置可以用公式:B+(i-1)*d计算;

•节约存储空间。

顺序存储的缺点:

•对顺序表作插入、删除时需要通过移动大量的数据元素,影响了运行效率。

•线性表预先分配空间时,必须按最大空间分配,存储空间得不到充分的利用。

•表的容量难以扩充(对有些高级语言而言)。

C#中的ArrayList酒是动态地改变数组大小的。ArrayList又成为动态数组,他的存储空间可以被动态的改变,同时还有添加、删除元素的功能。
以下是模拟ArrayList的部分核心代码实现:

usingSystem;
namespaceDataStructure
{
publicclassDAPArrayList
{
privateconstint_defaultCapacity=4;//初始容量
privateobject[]_items;//用于存放元素的数组
privateint_size;//指示当前元素个数
privatestaticreadonlyobject[]emptyArray=newobject[0];
publicDAPArrayList()
{
_items=emptyArray;
}
publicDAPArrayList(intcapacity)
{
if(capacity<0)
{
thrownewArgumentOutOfRangeException("Capacity","为DAPArrayList指定的初始容量不能为负数!");
}
_items=newobject[capacity];
}
publicvirtualintAdd(objectvalue)
{
returnthis._size++;
}
publicvoidEnsureCapacity(intmin)
{
if(this._items.Length_size)
{
thrownewArgumentOutOfRangeException("index","索引超出范围");
}
if(this._size==this._items.Length)
{
EnsureCapacity(_size+1);
}
if(index_size)
{
thrownewArgumentOutOfRangeException("index","索引超出范围");
}
this._size--;
if(index
///裁减空间
///
publicvirtualvoidTrimToSize()
{
Capacity=_size;
}
///
///元素个数
///
publicvirtualintCount
{
get
{
return_size;
}
}
publicvirtualobjectthis[intindex]
{
get
{
if(index<0||index>=_size)
{
thrownewArgumentOutOfRangeException("index","索引超出范围");
}
return_items[index];
}
set
{
if(index<0||index>=_size)
{
thrownewArgumentOutOfRangeException("index","索引超出范围");
}
_items[index]=value;
}
}
publicvirtualintCapacity
{
get
{
return_items.Length;
}
set
{
if(value!=_items.Length)
{
if(value<_size)
{
thrownewArgumentOutOfRangeException("value","容量太小");
}
if(value>0)
{
object[]destinationArray=newobject[value];
if(_size>0)
{
Array.Copy(_items,0,destinationArray,0,_size);
}
this._items=destinationArray;
}
else
{
_items=newobject[_defaultCapacity];
}
}
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: