顺序表

顺序表

#include <iostream>
#include <cassert>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef  int T;
const int defaultSize = 100;
class SeqList
{
private:
      T* data;//指向动态内存分配数组的指针
      int maxSize;//动态内存分配数组的大小
      int last;//标识顺序表中最后一个元素的位置
      void Resize(int newSize)
      {
          maxSize=newSize;
      }
public:
      SeqList(int sz=defaultSize)//构造函数
      {
             last=-1;
             data=new T[sz];
             maxSize=defaultSize;
      }
      SeqList(const SeqList& L)//拷贝构造函数
      {
            maxSize=L.maxSize;
            last=L.last;
            for(int i=0;i<last;i++)
            {
                data[i]=L.data[i];
            }
      }
      SeqList& operator=(const SeqList& L)//赋值运算符函数
      {
          maxSize=L.maxSize;
            last=L.last;
            for(int i=0;i<last;i++)
            {
                data[i]=L.data[i];
            }
            return *this;
      }
      ~SeqList()//析构函数
      {
          delete []data;
          last=0;
      }
      virtual int Size() const//返回顺序表的容量
      {
          return maxSize;
      }
      virtual int Length() const//返回顺序表中元素的个数
      {
          return last+1;
      }
      virtual int Search(T & x) const//在顺序表中搜索x
      {
          for(int i=0;i<=last;i++)
          {
              if(data[i]==x)
              {
                  return i+1;
              }
          }
          return 0;
      }
      virtual int Locate(int i) const//检验顺序表中是否存在第i个元素
      {
          if(i>last+1)
            return false;
          return true;
      }
      virtual bool GetData(int i, T& x) const//获取顺序表中第i个位置的元素
      {
          if(Locate(i-1))
          {
              x=data[i-1];
              return true;
          }
            return false;
      }
      virtual void SetData(int i, T& x)//将顺序表中第i个位置的元素赋值为x
      {
          if(Locate(i-1))
          {
              data[i-1]=x;
          }
      }
      virtual bool IsEmpty() const//顺序表是否为空
      {
          return last==0;
      }
      virtual bool IsFull() const//顺序表是否为满
      {
          return last==maxSize;
      }
      virtual bool Insert(int i, const T& x) //在顺序表的第i个元素的位置插入x
      {
          if(i<=last+2)
          {
              int j;
               for( j=last+1;j>=i;j--)
               {
                   data[j]=data[j-1];
               }
               data[j]=x;
               last++;
               return true;
          }
          return false;
      }
      virtual bool Remove(int i, T&x) //删除顺序表第i个位置的元素
      {
          if(Locate(i))
          {
              for(int j=i-1;j<last;j++)
              {
                  data[j]=data[j+1];
              }
              last--;
              return true;
          }
          return false;
      }
      virtual void Sort() //对顺序表中元素进行排序
      {
          for(int i=0;i<last;i++)
          {
              for(int j=i;j<=last;j++)
              {
                  if(data[i]>data[j])
                  {
                      T temp;
                      temp=data[i];
                      data[i]=data[j];
                      data[j]=temp;
                  }
              }
          }
      }
      friend istream& operator>>(istream& in, SeqList & L)//输入运算符重载
      {
          int i,num;
          in>>num;
          if(num<0) L.last=-1;
          L.last=num-1;
          for(i=0;i<=L.last;i++)
          {
              in>>L.data[i];
          }
          return in;
      }
      friend ostream& operator<<(ostream& out, const SeqList& L)//输出运算符重载
      {
          int i;
          for(i=0;i<=L.last;i++)
          {
              if(i==L.last)
              {
                  out<<L.data[i];
              }
              else
              out<<L.data[i]<<" ";
          /*for(i=0;i<L.last;i++)//这种做法会出错,因为last不合法时应不输出任何值
          {
              out<<L.data[i]<<" ";
          }
          out<<L.data[i];
          return out;*/
          }
          return out;
      }
      void Reverse ()//逆置顺序表中的元素
      {
          for(int i=0;i<=last/2;i++)
          {
              int temp;
              temp=data[i];
              data[i]=data[last-i];
              data[last-i]=temp;
          }
      }
};
int main()
{
     SeqList sList;
      cin>>sList;
      int i, val;
      cin>>i>>val;
      sList.Insert(i,val);
      cout<<sList;
      cin>>i;
      sList.Remove(i,val);
      cout<<sList;
      cin>>val;
      i=sList.Search(val);
      if(i==0)
            cout<<"Not found"<<endl;
      else
            cout<<i<<endl;
      sList.Reverse();
      cout<<sList;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值