线性表
一个线性表是n个数据元素的有限序列。数据元素可以是任何类型的数据。形如 (a1,...,ai-1,ai,ai+1,...,an),ai有且仅有一个直接前驱。线性表每个袁术也都有一个确定的位置,a1为第一个元素,a2为第二个,以此类推。当然当线性表也可以没有元素,此时它就被称为 空表 了。线性表可以进行访问,修改,插入和删除等操作。当然,还可以做一些扩充操作,比如表的合并与拆分等。
线性表的顺序表示和实现
线性表的顺序表示是指用一组地址连续的存储单元依次存储线性表的数据元素。这也就是说这些数据元素在内存中的分布是连续的。线性表的第一个元素的存储位置,通常也称作线性表的起始位置或者基地址。,通常这种线性表也叫做顺序表。只要知道元素的在表中的位置,通过指针可以很容易查找到。通常用数组来表示顺序表。
const int MaxListSize = 100;
class List
{
int data[MaxListSize];
int size; //元素的个数
public:
List(){ size = 0; }; //构造函数
~List();
void Clear(){ size = 0; }; //清空
bool IsEmpty(); //判断是否为空
int GetElem(int i); //返回第i个元素
int Locate(int e); //返回第一个与e匹配的元素位序
int Prior(int e); //返回e的前驱
int Next(int e); //返回e的后续
void Insert(int e,int i);//在i个位置插入新元素e
int Delete(int i); //删除第i个元素,并返回其值
int Length(){ return size; };
void print(); //输出线性表的元素
};
值得注意的是,线性表的总长度是固定的,若要存储的数据超出之前的估计将是一件麻烦的事情。
1.插入操作
void List::Insert(int e, int i){
//在顺序表的第i个元素之前插入新的元素e
//从数组中下标为i-1的元素后移
//i的合法范围为1 <= i <= size+1
if (i < 1 || i > size+1 || size >= MaxListSize)
{
cout << "插入不成功" << endl;
exit(0);
}
else
{
for (int j = size - 1; j >= i - 1; j--)
{
data[j + 1] = data[j];
data[i - 1] = e;
size++;
}
}
}
假设在线性表任何位置插入数据元素的概率是相同的,则插入一个元素时需要移动的元素的平均次数差不多占表中元素的一半,以上算法的平均时间复杂度为O(n);
2.删除操作
int List::Delete(int i){
if (i<1 || i>size)
{
cout << "删除位置不正确" << endl;
exit(0);
}
else
{
int e = data[i - 1];
for (int j = i-1; j < size-1; j++)
{
data[j] = data[j + 1];
size--;
return e;
}
}
}
算法的平均时间复杂度也是O(n).
3.定位操作
int List::Locate(int e){
int i = 1;
while (i<=size && data[i-1]!=e)
{
i++;
if (i > size) return 0; //没有找到
else return i;
}
}
算法的平均时间复杂度也是O(n).
4.判断线性表是否为空
bool List::IsEmpty(){
if (size == 0) return true;
else return false;
}
5.取元素
int List::GetElem(int i){
if (i<1 || i>size)
{
cout << "位置不正确" << endl;
exit(0);
}
else
{
return data[i - 1];
}
}
6.输出元素
void List::print(){
if (size == 0)
{
cout << "空表,无元素" << endl;
exit(0);
}
else
{
for (int i = 0; i < size; i++)
{
cout << data[i];
cout << endl;
}
}
}
顺序存储结构小结:
优点:
1.无需为表示数据元素间的逻辑关系增加额外的存储空间;
2.可以方便地随机存取表中的任一元素。
缺点:
1.顺序存储结构要求占用连续的存储空间,线性表中元素的最大个数需要预先设定,这个数值不好把握。
2.在进行插入操作和删除操作时需要移动大量的元素。如果表比较大那消耗也是不容乐观的。