数据结构课本学习 --顺序表

本文介绍了顺序表的构造函数、复制函数、搜索定位、插入删除等操作,并详细分析了这些操作的时间复杂度,包括最好、最坏及平均情况下的性能表现。
  • 顺序表的构造函数和复制函数     
//构造函数和复制构造函数
template <class T>
Seqlist<T>::SeqList(int sz){
//构造函数,通过指定参数sz定义数组的长度
     if(sz > 0){
        maxSize = sz;  last = -1;//置表的实际长度为空
        data = new T[maxSize];
        if(data == NULL)
        {
            cerr << "存储分配错误!"<< endl;
            exit(1);
        }
     }
}
template <class T>
SeqList<T>::SeqList(SeqList<T>& L){
//复制构造函数,
    maxSize = L.Size();last = L.Length()-1;
    data = new T[maxSize];//创建顺序表存储数组
    if(data == NULL)
        {
            cerr << "存储分配错误!"<< endl;exit(1);
        }
        for(int i =1; i <= last +1;i++)
            data[i-1] = L.getData(i);
    }
template <class T>
void SeqList<T>::reSize(int newSize){
//私有函数:扩充顺序表的存储数组空间大小
  if(newSize <= 0)
  {
    cerr << "无效的数组大小" << endl;return;
  }
  if(newSize != maxSize){
    T *newarray = new T[newSize];  //建立新数组
    if(newarray == NULL)
    {
        cerr << "存储分配错误" << endl;exit(1);
    }
    int n = last+1;
    T *srcptr = data;  //源数组的首地址
    T *destptr = newarray; //目的数组的首地址
    
    while(n--) *destptr++ = *srcptr++;//复制
    
    delete[]data;    //删除老数组
    data = newarray;maxSize = newSize; //复制新数组
  }

}

 

  • 搜索和定位
template <class T>
int SeqList<T>::search(T& x)const{
//在表中顺序搜索与给定值x的匹配表项,找到则函数返回表项第几个元素
//不然返回0,搜索失败
    for( int i=0; i <= last; i++)
        if(data[i] == x)return i+1;
    return 0;
}

template <class T>
int SeqList<T>::Locate(int i)const{
//定位函数: 函数返回第i个表项的位置
    if(i >=1 && i <= last+1)return i;
    else return 0;
}

 

  • 插入和删除
    • //插入
      template <class T>
      bool SeqList<T>::Insert(int i, T& x){    //思考 T& x的意思
      //将新元素插入表中i的位置
      //成功返回true,否则返回false
          if(last == maxSize-1) return false;//表满不可插入
          if(i<0 || i>last+1)return false;
          for (int j = last; j >= i; j--)
              data[j+1] = data[j];
          data[i] = x;
          last++;
          return true;
      }
      //删除
      template <class T>
      bool SeqList<T>::Remove(int i,T& x){
      //从 表中删除第i个表项,通过引用型参数x返回删除的元素值
           if(last == -1)return false;
           if(i<1 || i>=last+1)return false;
           x = data[i-1];         //存被删元素的值
           for(int j=i; j<=last; j++)
              data[j-1] = data[j];
           last--;
           return true;
      }
  • 顺序表的性能分析
    • int search(T &x)是顺序搜索算法,从表的开始位置起,将各个表项值与x进行比较
      • 最好情况:正好是表的第一项,比较次数为1;
      • 最坏情况:正好是表的最后一项,比较次数为n;
      • 平均情况:搜索各个项的概率相同,设为1/n,而比较的平均次数应当为ACN=1/n(1+2+3+4+5...+n)= (1+n)/2。
      顺序表的插入时间代价:
      • 最好在第n个表项插入,移动表项数为0;
      • 最差在第一个表项插入,移动次数为n;
      • 平均为AMN=1/(1+n)(n+...+1+0)=n/2;
    • 顺序表的删除时间代价:
      • 最好:删去最后一项,移动个数为0
      • 最差:删去第一项,移动个数为n-1;
      • 平均:AMN=1/n((n-1)+...+1+0)=(n-1)/2;
  • 顺序表的应用

 

转载于:https://www.cnblogs.com/frl520/p/9404006.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值