【C++算法】 线性表的Half().

要求:如果原先a[7] = { 2,13,4,7,17,9,5}  , x.half() 以后为 a[4] = {2,4,17,5}

           如果原先为 a[4] = {15, 7, 2, 11}  , x.half() 以后为   a[ 2] = { 15, 2}.

分析:有3个点。(1),half以后的索引。 奇数为 (k+1)/2  偶数为 k/2 ;

                             (2)      数组的值为一个跳一个,a[0],a[2],a[4]....

                             (3)      第3点最难,卡住了我好久。最核心的突破是 :把整个指针都替换。

  1. template <class T>
  2. class LinearList
  3. {
  4. private:
  5.     int length;
  6.     int MaxSize;
  7.     T *element;
  8. public:
  9.     LinearList(int Max = 10);
  10.     LinearList(int L, int M, T ele[]);    
  11.     ~LinearList() { delete[] element; }   
  12.     int Length() const { return length; };  
  13.     void Show();
  14.     LinearList<T> & back_inserter(int k, const T & x);
  15.     void Half();
  16. }
  1. //再贴个Show函数的定义就好。
  2. template<class T>
  3. void LinearList<T>::Show()
  4. {
  5.     int len = this->Length();
  6.     for (int i = 0; i < len; i++)
  7.         cout << element[i] << "  ";
  8. }

 第三点。把element[]  进行 取半操作后,如何把后面多的元素删除掉 。

其实概念“删除” 已经自己走向了误区。

正确的思路 :1.用新的符合要求的数组指针。去赋值,覆盖掉 element.

这样就把7个元素可以变成4个,6个元素变成3个。这是第一步最核心的实现。

2.第二步,要把 这个LinearList 的其他数据成员修改。即 length 修改成新的length。length值不更新的话,

会影响Show() 里的cout.

  1. template <class T>
  2. void LinearList<T>::Half()
  3. {
  4.     int k;
  5.     int j = this->Length();
  6.     if (j % 2 == 0)
  7.         k = j / 2;    
  8.     else  k = (j + 1) / 2;
  9.     length = k;
  10.     T * lf = new T[k];
  11.     for (int i = 0; i < k; i++)
  12.         lf[i] = this->element[2i];
  13.     this->element = lf;
  14.     delete[] lf;
  15. }

猜你喜欢

转载自blog.csdn.net/shengda_mao1118/article/details/82117204
今日推荐