线性表 順序储存结构
定义
线性表简称表,是具有相同类型的数据结构元素的有限序列,线性表中数据元素个数成为线性表的长度。
顺序表
由于线性表中每个数据的类型相同,通常用一维数组来实现顺序表,也就是把线性表中相邻的元素存储在数组中相邻的位置,从而导致了数据元素的序号和存放它的数组的下标一 一对应关系。
注意:
- 数组的长度是一个确定的长度,而线性表的长度是一个不确定的值(要完成 插入、删除等操作),因此数组长度MaxSize一般大于线性表的Length。
- 因为数组的编号是从0开始,而线性表的序号是从1开始的。所以ai = a[i + 1]
- 令线性表的序号从0开始可以使得线性表的序号与数组的下标相同
- 将数组的首位浪费,即从数组的1号单元开始存储数据元素,使得数组的下标与线性表的序号相同。
- 讨论地址时问题时,一般选定一个参考存储单元作为基准单元(也称为基准地址),所涉及地址均以此基地址为基准,称这种地址为相对地址(或者是偏移地址)。
顺序表的实现
const int MaxSize = 100;
template <class DataType>
class Seqlist
{
public:
SeqList (){length = 0}
SeqList {DataType a[],int n};
~SeqList (){ }
int Length(){return length;}
DataType Get (int i);
int Locate(DataType x);
void Insert(int i, DataType x);
DataType Delete (int i);
void printList ();
private:
DataType data[MaxSize];
int length;
}
顺序表的构造也极其简单:
template <class DataType>
SeqList <DataType>::SeqList(DataType a[],int n)
{
if (n > MaxSize)
throw "参数非法";
for(i = 0; i < n; i++)
{
data[i] = a[i];
}
length = n;
}
顺序表的操作较为简单就不一一举例了
提一下插入与删除吧
插入
template <class DataType>
void SeqList <DataType> :: Insert(int i, DataType x)
{
if (length >= MaxSize)
throw "上溢";
if (i < 1 || i > length + 1)
throw "位置";
for (j = length; j >= i; j--)
{
data[j] = data[j - 1];
}
data[i - 1] = x;
length++;
}
删除
template <class DataType>
void SeqList <DataType> :: Delete(int i)
{
if (length = 0)
throw "下溢";
if (i <= 1 || i > length)
throw "位置";
x = data [i - 1];
for (j = i; j < length; j++)
{
data[j - 1] = data[j];
}
length--;
return x;
}
进一步了解算法可以关注微信公众号:南瓜算法