zoukankan      html  css  js  c++  java
  • 2.1 线性表+2.2 顺序表

     C++代码实现顺序表

      1 #include <iostream>
      2 #include <cassert>
      3 #include <cstdlib>
      4 #include <ctime>
      5 using namespace std;
      6 typedef int T;
      7 const int defaultSize = 100;
      8 
      9 class SeqList
     10 {
     11 private:
     12     T* data;//指向动态内存分配数组的指针
     13     int maxSize;//动态内存分配数组的大小
     14     //data数组里的个数,从1开始
     15     int last;//标识顺序表中最后一个元素的位置
     16     //位置,从零开始
     17     void Resize(int newSize);
     18 public:
     19     SeqList(int sz=defaultSize);//构造函数
     20     SeqList(const SeqList& L);//拷贝构造函数
     21     SeqList& operator=(const SeqList& L);//赋值运算符函数
     22     ~SeqList();//析构函数
     23 
     24     int Size() const;//返回顺序表的容量
     25     int Length() const;//返回顺序表中元素的个数
     26     int Search(T & x) const;//在顺序表中搜索x
     27     int Locate(int i) const;//检验顺序表中是否存在第i个元素
     28     bool GetData(int i, T& x) const;//获取顺序表中第i个位置的元素
     29     void SetData(int i, T& x);//将顺序表中第i个位置的元素赋值为x
     30     bool IsEmpty() const;//顺序表是否为空
     31     bool IsFull() const;//顺序表是否为满
     32     bool Insert(int i, const T& x) ;//在顺序表的第i个元素的位置插入x
     33     bool Remove(int i, T&x) ;//删除顺序表第i个位置的元素
     34 
     35     void Sort();//对顺序表中元素进行排序
     36     friend istream& operator>>(istream& in, SeqList & L);//输入运算符重载
     37     friend ostream& operator<<(ostream& out, const SeqList& L);//输出运算符重载
     38     void Reverse();//逆置顺序表中的元素
     39 };
     40 
     41 SeqList::SeqList(int sz)
     42 {
     43     if(sz > 0)
     44     {
     45         maxSize = sz;
     46         last = -1;
     47         data = new T[maxSize];
     48         if(data == NULL)
     49         {
     50             cout << "data is wrong!" << endl;
     51             exit(1);
     52         }
     53     }
     54     else
     55         cout << "number is wrong!" << endl;
     56 }
     57 
     58 SeqList::SeqList(const SeqList& L)
     59 {
     60     maxSize = L.maxSize;
     61     last = L.last;
     62     data = new T[maxSize];
     63     if(data == NULL)
     64     {
     65         cout << "memery is wrong!" << endl;
     66         exit(1);
     67     }
     68     for(int i=0; i<=last; i++)
     69     {
     70         data[i]=L.data[i];
     71     }
     72 }
     73 
     74 SeqList& SeqList::operator=(const SeqList&L)
     75 {
     76     if(this==&L)
     77         return *this;
     78     delete []data;
     79 
     80     maxSize = L.maxSize;
     81     last = L.last;
     82     data = new T[maxSize];
     83     if(data == NULL)
     84     {
     85         cout << "memery is wrong!" << endl;
     86         exit(1);
     87     }
     88     for(int i=0; i<last; ++i)
     89         data[i] = L.data[i];
     90     return *this;
     91 }
     92 
     93 SeqList::~SeqList()
     94 {
     95     delete[]data;
     96 }
     97 
     98 int SeqList::Size() const
     99 {
    100     return maxSize;
    101 }
    102 
    103 int SeqList::Length() const
    104 {
    105     return last+1;
    106 }
    107 
    108 void SeqList::Resize(int newsize)
    109 {
    110     if(newsize <= 0)  //检查是否合法
    111         return;
    112     if(newsize != maxSize)
    113     {
    114         T* newAry = new T[newsize];
    115         if(newAry == NULL)
    116             exit(1);
    117         int n = last+1;
    118         T* srcptr = data;
    119         T* destptr = newAry;
    120         while(n--)
    121             *destptr++ = *srcptr++;  //指针赋值
    122         delete[]data;
    123         data = newAry;
    124         maxSize = newsize;
    125     }
    126 }
    127 
    128 int SeqList::Search(T& x)const
    129 {
    130     for(int i=0; i<=last; i++)
    131         if(data[i]==x)
    132             return i+1;
    133     return 0;
    134 }
    135 
    136 int SeqList::Locate(int i)const
    137 {
    138     if(i>=1 && i<=last+1)
    139         return i;
    140     else
    141         return 0;
    142 }
    143 
    144 bool SeqList::GetData(int i, T& x) const
    145 {
    146     if(Locate(i))
    147     {
    148         x=data[i-1];
    149         return true;
    150     }
    151     else
    152         return false;
    153 }
    154 
    155 void SeqList::SetData(int i, T& x)
    156 {
    157     if(Locate(i))
    158         data[i-1]=x;
    159 }
    160 
    161 bool SeqList::IsEmpty()const
    162 {
    163     if(last == -1)
    164         return true;
    165     else
    166         return false;
    167 }
    168 
    169 bool SeqList::IsFull()const
    170 {
    171     if(last == maxSize-1)
    172         return true;
    173     else
    174         return false;
    175 }
    176 
    177 bool SeqList::Insert(int i, const T& x)
    178 {
    179     if(last == maxSize-1) //如果满了,扩大空间
    180     {
    181         Resize(defaultSize);
    182     }
    183     if(i<0||i>last+1)  //不在长度之内,给出提示,不插入
    184         return false;
    185     for(int j=last; j>=i-1; j--)
    186         data[j+1]=data[j];
    187     data[i-1] = x;
    188     last++;
    189     return true;
    190 }
    191 
    192 bool SeqList::Remove(int i,T& x)
    193 {
    194     if(last == -1)   //空表,给出提示
    195     {
    196         cout << "empty" << endl;
    197         return false;
    198     }
    199     if(!Locate(i))
    200         return false;
    201     x=data[i-1];
    202     for(int j=i-1; j<last; j++)
    203         data[j]=data[j+1];
    204     last--;
    205     return true;
    206 }
    207 
    208 void SeqList::Sort()
    209 {
    210     for(int i=0; i<=last; i++)
    211         for(int j=i; j<last; j++)
    212         {
    213            // cout << data[i] << ' ' << data[j] << endl;
    214             if(data[i]>data[j])
    215                 swap(data[i],data[j]);
    216         }
    217 
    218 }
    219 
    220 void SeqList::Reverse()
    221 {
    222     for(int i=0,j=last-1; i<j; i++,j--)
    223     {
    224         //cout << data[i] << ' ' << data[j] << endl;
    225         swap(data[i],data[j]);
    226     }
    227 }
    228 
    229 istream& operator>>(istream& in, SeqList & L)
    230 {
    231     while(1)
    232     {
    233         cout << "The number of the list: ";
    234         cin>>L.last;
    235         if(L.last<=L.maxSize-1)
    236             break;
    237         else
    238         {
    239             cout << "please try again." << endl;;
    240         }
    241     }
    242     for(int i=0; i< L.last; i++)
    243     {
    244         cin >> L.data[i];
    245 
    246     }
    247     return in;
    248 }
    249 
    250 ostream& operator<<(ostream& out, const SeqList& L)
    251 {
    252     cout << "The number of the list: ";
    253     for(int i=0; i< L.last; i++)
    254         cout << L.data[i] <<' ';
    255     cout << endl;
    256     return out;
    257 }
    258 
    259 int main()
    260 {
    261     SeqList sList;
    262 
    263     cin >> sList;
    264     cout<<sList;
    265 
    266     cout << "insert: ";
    267     int i, val;
    268     cin>>i>>val;
    269     sList.Insert(i,val);
    270     cout<<sList;
    271 
    272     cout << "remove: ";
    273     cin>>i;
    274     sList.Remove(i,val);
    275     cout<<sList;
    276 
    277     cout << "search: ";
    278     cin>>val;
    279     i=sList.Search(val);
    280     if(i==0)
    281         cout<<"Not found"<<endl;
    282     else
    283         cout<<i<<endl;
    284 
    285     cout << "reverse: " << endl;
    286     sList.Reverse();
    287     cout<<sList;
    288 
    289     cout << "sort: " << endl;
    290     sList.Sort();
    291     cout<<sList;
    292 
    293     SeqList L2;
    294     L2=sList;
    295     cout << "L2 is :" << L2;
    296 }

    测试结果

  • 相关阅读:
    基于php缓存的详解
    Nginx 的 Location 配置指令块
    Nginx负载均衡与反向代理的配置实例
    Linux下mysql定时备份及恢复
    KVO的底层实现
    小谈KVC中KeyPath的集合运算符
    iOS开发中常用的单例
    内存中的5大区域
    需要记住的几个ASCII码
    结构体-内存对齐
  • 原文地址:https://www.cnblogs.com/syzyaa/p/13734109.html
Copyright © 2011-2022 走看看