要求:如果原先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点最难,卡住了我好久。最核心的突破是 :把整个指针都替换。
- template <class T>
- class LinearList
- {
- private:
- int length;
- int MaxSize;
- T *element;
- public:
- LinearList(int Max = 10);
- LinearList(int L, int M, T ele[]);
- ~LinearList() { delete[] element; }
- int Length() const { return length; };
- void Show();
- LinearList<T> & back_inserter(int k, const T & x);
- void Half();
- }
- //再贴个Show函数的定义就好。
- template<class T>
- void LinearList<T>::Show()
- {
- int len = this->Length();
- for (int i = 0; i < len; i++)
- cout << element[i] << " ";
- }
第三点。把element[] 进行 取半操作后,如何把后面多的元素删除掉 。
其实概念“删除” 已经自己走向了误区。
正确的思路 :1.用新的符合要求的数组指针。去赋值,覆盖掉 element.
这样就把7个元素可以变成4个,6个元素变成3个。这是第一步最核心的实现。
2.第二步,要把 这个LinearList 的其他数据成员修改。即 length 修改成新的length。length值不更新的话,
会影响Show() 里的cout.
- template <class T>
- void LinearList<T>::Half()
- {
- int k;
- int j = this->Length();
- if (j % 2 == 0)
- k = j / 2;
- else k = (j + 1) / 2;
- length = k;
- T * lf = new T[k];
- for (int i = 0; i < k; i++)
- lf[i] = this->element[2i];
- this->element = lf;
- delete[] lf;
- }