基本知识:
(1)线性表主要有两种储层方式:顺序存储和链式存储
(2)用顺序存储方式存储线性表称为顺序表,顺序表可以随机访问,它可以通过元素的位置来访问数据元素,存储空间在物理上是连续的;即在逻辑上相邻的数据元素在物理上也必然相邻;
(3)线性表的基本操作常见的有:初始化、求长度、取指定元素的值、元素定位、修改指定元素的值、插入、删除、判断表是否为空、表清空等等
(4)在插入和删除时需要移动元素,顺序表的时间复杂度为O(n);
(5)顺序表类模板定义:(注:有几个成员函数还没有实现,VS不支持类模板与其实现方式分文件编译,均放在头文件中)
实现代码:
#ifndef GUARD_seqlist_h
#define GUARD_seqlist_h
#include<iostream>
using namespace std;
template<class ElemType>
class SeqList{
public:
SeqList(int size);//默认构造函数
SeqList(ElemType v[],int n,int size);//根据数组v构造顺序表
virtual ~SeqList();
int GetLength()const;//取顺序表长度
bool IsEmpty() const;
void clear();//元素清空
void Traverse(void(*Vist)(const ElemType&))const;//元素遍历
int LocateElem(const ElemType& e);//元素定位
void SetElem(int i,const ElemType& e);//修改第i个元素
void DelElem(int i);//删除顺序表第i个值
void InsElem(int i,const ElemType& e);//在第I个位置插入元素
void InBackElem(ElemType& e);//在表尾插入元素;
SeqList(const SeqList<ElemType>& s);//复制构造函数
private:
int length;
int maxLength;
ElemType* elems;
};
template<class ElemType>
SeqList<ElemType>::SeqList(int size){
elems=new ElemType[size];
assert(elems);
length=0;
maxLength=size;
}
template<class ElemType>
int SeqList<ElemType>::GetLength()const{
return length;
}
template<class ElemType>
SeqList<ElemType>::SeqList(ElemType v[],int n,int size){
elems=new ElemType[size];
length=n;
maxLength=size;
for(int i=0;i<length;i++)
elems[i]=v[i];
}
template<class ElemType>
SeqList<ElemType>::~SeqList(){
delete []elems;
}
template<class ElemType>
void SeqList<ElemType>::clear(){
length=0;
}
template<class ElemType>
int SeqList<ElemType>::LocateElem(const ElemType& e){
int i=0;
while(i<length&&elems[i]!=e)
i++;
return i<length?(i+1):0;
}
template<class ElemType>
void SeqList<ElemType>::SetElem(int i,const ElemType& e){
if(i<1||i>length)
std::cout<<"RANGE_ERROR"<<std::endl;
else{
elems[i-1]=;
std::cout<<"SUCCESS"<<std::endl;
}
}
template<class ElemType>
void SeqList<ElemType>::DelElem(int i){
if(i<1||i>length)
{
std::cout<<"RANGE_ERROR"<<std::endl;
}
else{
ElemType e=elems[i-1];
for(int j=i;j<length;j++)
elems[j-1]=elems[j];
length--;
std::cout<<"SUCCESS"<<std::endl;
}
}
template<class ElemType>//相当于要把插入元素之后的元素都要后移动一个位置
void SeqList<ElemType>::InsElem(int i,const ElemType& e){
if(i<1||i>length+1)
std::cout<<"RANGE_ERROR"<<std::endl;
else if(length==maxLength)
std::cout<<"OVER_FLOW"<<std::endl;
else{
for(int j=length;j>=i;j--)
elems[j]=elems[j-1];
elems[i-1]=e;
length++;
}
}
template<class ElemType>
void SeqList<ElemType>::InBackElem(ElemType& e){
if(length==maxLength)
std::cout<<"OVER_FLOW"<<std::endl;
else{
elems[length]=e;
length++;
}
}
#endif