您的位置:首页 > 编程语言 > C语言/C++

顺序表上进行增,删,查,改操作,C++实现

2016-10-18 23:05 369 查看
一、代码实现

<pre name="code" class="java">


<span style="font-family:Arial;">#include <iostream>//是1的另一种形式

using namespace std;
int defaultSize=100;
template <typename T>
class SeqList
{
private:
//数据成员的定义
T* data;
int maxSize;
int last;
public:
SeqList(int sz=defaultSize);
~SeqList();
SeqList(const SeqList<T>& L);
ostream& operator =(const SeqList<T>& L);

bool Insert(int i,const T& elem);
bool Remove(int i,T& elem);
int Search(const T& elem);
void Setdata(int i,const T& elem);
bool Getdata(int i,T& elem);
//顺序表的拷贝构造函数
void SeqList(const SeqList<T>& L)
{
maxSize=L.maxSize;
last=L.last;
data=new T[maxSize];
if(data==NULL)
{
cerr<<"存储分配失败"<<endl;
exit(1);
}
for(int i=0;i<=last;i++)
{
data[i]=L.data[i];
}

}
bool IsFull()
{
return last==maxSize-1;
}
bool IsEmpty()
{
return last==-1;
}
friend ostream&operator<<(ostream& out,const SeqList<T>& L)/////friend
{
for(int i=0;i<=L.last;i++)
{
cout<<L.data[i]<<"   ";
}
cout<<endl;
return out;
}
};

//在这个构造函数里面创建顺序表
template <typename T>
SeqList<T>::SeqList(int sz)
{
maxSize=sz;//创建顺序表
data=new T[maxSize];//创建顺序表
last=-1;//使线性表为空
}

//用析构函数销毁顺序表。释放data所指的内存空间
template<typename T>
SeqList<T>::~SeqList()
{
delete [] data;
}

template<typename T>
bool SeqList<T>::Insert(int i,const T& elem)
{
if(last==maxSize-1)
{
cerr<<"线性表已满"<<endl;
return false;
}
if(i<1 || i>last+2)
{
cerr<<"插入位置越界"<<endl;
return false;
}
for(int j=last;j>=i-1;j--)//特别注意这三行
{
data[j+1]=data[j];
}
data[i-1]=elem;
last++;
return true;
}

template<typename T>
bool SeqList<T>::Remove(int i,T& elem)
{
if(last==-1)
{
cerr<<"线性表为空"<<endl;
return false;
}
if(i<1 || i>last+1)
{
cerr<<"插入位置越界"<<endl;
return false;
}
elem=data[i-1];
for(int j=i-1;j<last;j++)
{
data[j]=data[j+1];
}
last--;
return true;
}

template<typename T>
int SeqList<T>::Search(const T& elem)
{
for(int j=0;j<=last;j++)
{
if(data[j]==elem)
{
return j+1;
}
}
return 0;
}

template<typename T>
void SeqList<T>::Setdata(int i,const T& elem)
{
if(i<1 || i>last+1)
{
cerr<<"插入位置越界"<<endl;
}
else
{
data[i-1]=elem;
}

}

template<typename T>
bool SeqList<T>::Getdata(int i,T& elem)
{
if(i<1 || i>last+1)
{
cerr<<"插入位置越界"<<endl;
return false;
}
elem=data[i-1];
return true;

}

int main()
{
SeqList<int> lst;
SeqList<char> lstc;
SeqList<double>  lsts;

for(int i=1;i<=10;i++)
{
lst.Insert(i,i);
}
lst.Insert(5,100);
cout<<lst;
cout <<lst.Search(100)<<endl;
return 0;
}</span>


二、插入操作的时间复杂度

在表中第i 个位置插入,从data[i-1] 到data [n-1] 成块后移,移动n-1-(i-1)+1 = n-i+1项。
考虑所有插入位置,相等插入概率时,从1 到 n+1,平均移动元素个数为:



二、删除操作的时间复杂度

删除第 i 个表项,需将第 i+1 项到第 n 项全部前移,需前移的项数为
n-(i+1)+1 = n-i

考虑表中所有可能删除位置(1≤i≤n-1),相等删除概率时,平均移动元素个数为:



最后,来张图,放松一下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息