今天总结一下数据结构中的线性表中的顺序存储结构,这是一种比较简单的结构。
首先,看一下什么是线性表。
什么是线性表?
线性表是一种简单的数据结构,数据元素之间是一对一的关系,即除了第一个和最后一个元素外其余元素都是首尾相接的。元素的个数称为线性表的长度,长度为零则表示线性表为空。
什么是线性表的顺序存储结构?
线性表中的顺序存储结构就是把线性表中的元素按逻辑次序依次存放在一组地址连续的存储空间中,也把这种线性表称为顺序表。根据顺序表的特点,通常是用数组来存储元素的。
下面就看具体的实现(C++)。
定义一个顺序表的模板类,声明相应的方法。
<span style="font-family:Courier New;font-size:14px;">const int MAXSIZE = 1000; //定义顺序表的最大长度
template <class T> //定义模板类
class SeqList {
public:
SeqList() {
length = 0; //无参构造函数
}
//初始化一个含有n个元素的顺序表
SeqList(const T a[],int n);
int GetLength() //获取顺序表的长度
return length;
}
void PrintList(); //打印出顺序表中的元素值
void Insert(int i,T x); //将元素x插入到指定的位置
T Delete(int i); //删除位置为i的元素
T Get(int i); //返回位置为i的元素的值
int Locate(T x); //查找顺序表中值为x的元素,返回其位置
private:
int length; //顺序表长度
T data [MAXSIZE]; //存储数据元素的数组
};</span>
有参数的构造方法的实现:一次将给定数组里的元素赋值给data数组,若元素个数超过顺序表长度,则抛出异常<span style="font-family:Courier New;font-size:14px;">template <class T>
SeqList<T>::SeqList(const T a[],int n) {
if(n>MAXSIZE)
throw "数组长度不能超过顺序表的最大长度";
for(int i=0;i<n;i++) {
data[i] = a[i];
}
length = n;
}</span>
遍历顺序表中的元素,比较简单,for循环,一次取出数组元素即可.
<span style="font-family:Courier New;font-size:14px;">template <class T>
void SeqList<T>::PrintList() {
cout<<"按顺序依次遍历顺序表中的元素"<<endl;
for(int i=0;i<length;i++) {
cout<<data[i]<<" ";
}
cout<<endl;
}</span>
顺序表的插入操作思路:
- 判断此时顺序表是否已满,若满,则抛出异常
- 判断插入的位置是否合理,比如不能插在比顺序表长度还大的位置
- 依次从最后一个元素开始到第i个元素,分别向后移一个位置,空出要插入的位置
- 将元素插入到指定位置
- 将循序表长度增1
<span style="font-family:Courier New;font-size:14px;">template <class T>
void SeqList<T>::Insert(int i,T x) {
if(length>MAXSIZE) throw "长度过大";
if(i<1||i>=length+1) throw "插入位置不存在";
//从后往前遍历 将数组元素依次后移 直到等于i时
for(int j=length;j>=i;j--){
data[j] = data[j-1];
}
data[i-1] =x;
length++; //数组长度增1
}</span>
顺序表的删除操作思路:
- 如果表空,则抛出异常
- 如果删除元素位置不存在,则抛出位置异常
- 取出要删除的元素,保留下来(可以知道删除的是哪个元素)
- 依次将第i+1个到n的元素,向前移动一个位置
- 顺序表长度减1,返回删除的元素
<span style="font-family:Courier New;font-size:14px;">template <class T>
T SeqList<T>::Delete(int i) {
T n = data[i-1]; //待删元素
for(int j=i;j<length;j++) {
data[j-1] = data[j];
}
length--;
return n;
}</span>
获取顺序表中的元素以及位置:
<span style="font-family:Courier New;font-size:14px;">template <class T>
T SeqList<T>::Get(int i) {
return data[i-1];
}
template <class T>
int SeqList<T>::Locate(T x) {
for(int i=0;i<length;i++) {
if(data[i]==x) {
return i+1;
}
}
return 0;
}</span>
测试:
<span style="font-family:Courier New;font-size:14px;">int main()
{
int a[6]={11,21,22,43,23,14};
SeqList<int> list(a,6);
list.PrintList();
list.Insert(2,5);
list.PrintList();
int x = list.Delete(3);
cout<<"删除元素为:"<<x<<endl;
list.PrintList();
int i = list.Locate(22);
cout<<"22所在的位置为:"<<i<<endl;
return 0;
}</span>
结果: