顺序表
顺序表是在计算机内存中以
数组
的
形式保存的线性表,是指用一组地址连续的
存储单元
依次存储
数据元素
的线性结构。线性表采用顺序存储的方式存储就称之为顺序表。顺序表是将表中的结点依次存放在计算机内存中一组地址连续的存储单元中。
下面是顺序表的实现:
template <class Elem>
class AList : public List<Elem>
{
private:
Elem* listArray; //容纳元素的数组
int maxSize; //顺序表允许存放元素的最大值
int fence; //栅栏的位置
int listSize; //顺序表当前元素的个数
enum { DefaultListSize = 500 }; //顺序表默认最大值
public:
// 构造函数:初始化成员变量
AList(int size=DefaultListSize)
{
maxSize = size;
listSize = fence = 0;
listArray = new Elem[maxSize];
}
// 折构函数:释放堆内存
~AList() { delete [] listArray; }
void clear() //清空顺序表
{
delete [] listArray;
listSize = fence = 0;
listArray = new Elem[maxSize];
}
// 向右表表头插入元素
bool insert(const Elem&);
// 向右表表尾拼接元素
bool append(const Elem&);
// 删除右表表头的元素,并返回
bool remove(Elem&);
// 设置栅栏位置为顺序表的第一个元素之前
void setStart() { fence = 0; }
// 设置栅栏位置为顺序表的最后一个元素之后
void setEnd() { fence = listSize; }
// 栅栏向左移动一个单位
void prev() { if(fence != 0) --fence; }
// 栅栏向右移动一个单位
void next() { if(fence < maxSize) ++fence; }
// 返回左表长度
int leftLength() const { return fence; }
// 返回右表长度
int rightLength() const { return listSize - fence; }
// 设置栅栏的位置
bool setPos(int pos)
{
if(pos>=0 && pos<=listSize)
{
fence = pos;
return true;
}
return false;
}
// 获取右表表头元素的值,若右表为空返回false
bool getValue(Elem & it) const
{
if(rightLength() == 0)
return false;
it = listArray[fence];
return true;
}
// 输出顺序表
void print() const
{
int temp = 0;
cout << "< ";
while(temp < fence) // 输出左表
cout << listArray[temp++] << " ";
cout << "| ";
while(temp < listSize) //输出右表
cout << listArray[temp++] << " ";
cout << ">\n";
}
};
// 向右表表头插入元素
template <class Elem>
bool AList<Elem>::insert(const Elem& item)
{
if(listSize == maxSize)
return false;
// 向后移动右表
for(int i=listSize; i>fence; --i)
listArray[i] = listArray[i-1];
listArray[fence] = item;
++listSize;
return true;
}
// 向右表表尾拼接元素
template <class Elem>
bool AList<Elem>::append(const Elem& item)
{
if(listSize == maxSize)
return false;
listArray[listSize++] = item;
return false;
}
// 删除右表表头的元素,并返回值
template <class Elem>
bool AList<Elem>::remove(Elem& item)
{
// 右表为空
if(rightLength() == 0)
return false;
item = listArray[fence];
// 向前移动右表
for(int i=fence; i<listSize-1; ++i)
listArray[i] = listArray[i+1];
--listSize;
return true;
}
顺序表继承了抽象类List,因此它实现List的所有成员函数。
类AList把表中的元素储存在数组中的相邻位置上。数组的位置与元素的位置相对应。换句话说,就是表中的第
i
个元素存储在数组第
i
的个单元中。表头总是在第0个位置,这使得很容易便可对表中任意一个元素进行随机访问。个提出表中的某个位置,该位置对应袁术的值就可以直接获取。因此setPos函数和getValue函数访问任意元素只需花费θ(1)时间。
此外,append函数也只需花费θ(1)时间,但是,insert函数和remove函数,这样在表中添加或者删除一个元素,必须将该元素后面的元素移动一个位置。如果表中已有n个元素,那么这个过程需要花费θ(n)时间。而如果在n个元素的表中的第i个位置插入元素,那么n-i个元素需要往后移动;删除则要n-i-1个元素往前移动。平均来说,插入和删除要移动一半元素,即需要花费θ(n)时间。