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

本文介绍了一个通用的顺序表模板类实现,并详细解析了插入和删除操作的时间复杂度。通过示例展示了如何使用该模板类进行数据操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、代码实现                                                                                          

<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),相等删除概率时,平均移动元素个数为:


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



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值