代码所示为模板类,无法直接编译。我感觉学习数据结构主要还是学习各种数据结构的原理,至于只用是比较简单的。
顺序表AList是由线性表List抽象类继承来的。从代码数量上就能够看出AList类中insert和remove方法是比较重要的。将顺序表看成由两部分构成,在AList类中定义了fence属性,是为了定义当前元素的概念,同时也助于修改线性表的表示形式。
insert函数的实现是先判断表是否达到最大的数量限制,如果是则返回false,表示不能在表中插入元素。否则从后向前遍历顺序表(因为如果从前往后的话,在赋值的时候前面的元素值就将后面的给覆盖了,后面的那个元素就无法继续向后赋值了)然后将前一个位置的元素赋给后一个位置,意思就是将顺序表从fence开始向后移动一个位置,最后将要插入元素赋给fence位置。即完成了插入操作。当然要注意将表的元素个数加一这种细节。
remove函数也是先要判断表是否为空,若为空则无法完成移除操作。若不为空则将要移除的元素保存下来,然后遍历表,从fence位置开始,依次将后一个位置的元素赋给前一个元素,实际上相当于将想要移除的元素用后面的元素给覆盖了。
- //List abstract class
- template <class Elem> class List
- {
- public:
- //virtual void clear() = 0;
- virtual bool insert(const Elem&) = 0;
- virtual bool append(const Elem&) = 0;
- virtual bool remove(Elem&) = 0;
- virtual void setStart() = 0;
- virtual void setEnd() = 0;
- virtual void prev() = 0;
- virtual void next() = 0;
- virtual int leftLength() = 0;
- virtual int rightLength() = 0;
- virtual bool setPos(int pos) = 0;
- virtual bool getValues(Elem&) = 0;
- virtual void print() const = 0;
- };
- template <class Elem>
- class AList : public List<Elem>
- {
- private:
- int maxSize;
- int listSize;
- int fence;
- Elem *listArray;
- public:
- AList(int size=DefaultListSize)
- {
- maxSize = size;
- listSize = fence = 0;
- listArray = new Elem[maxSize];
- }
- ~AList()
- {
- delete [] listArray;
- }
- bool insert(const Elem&);
- bool append(const Elem&);
- bool remove(Elem&);
- void setStart();
- void setEnd();
- void prev();
- void next();
- int leftLength();
- int rightLength();
- bool setPos(int pos);
- bool getValues(Elem&);
- void print() const;
- };
- template <class Elem>
- bool AList<Elem>::insert(const Elem& item)
- {
- if(listSize==maxSize)
- return false;
- for(int i=listSize;i>fence;i--)
- listArray[i] = listArray[i-1];
- listArray[fence]=item;
- listSize++;
- return true;
- }
- template <class Elem>
- bool AList<Elem>::append(const Elem& item)
- {
- if(listSize == maxSize)
- return false;
- listArray[listSize++]=item;
- return true;
- }
- template <class Elem>
- bool AList<Elem>::remove(Elem& it)
- {
- if(rightLength() == 0)
- return false;
- it=listArray[fence];
- for(int i=fence;i<maxSize;i++)
- listArray[i]=listArray[i+1];
- listSize--;
- return true;
- }
- template <class Elem>
- void AList<Elem>::setStart()
- {
- fence=0;
- }
- template <class Elem>
- void AList<Elem>::setEnd()
- {
- fence=listSize;
- }
- template <class Elem>
- void AList<Elem>::prev()
- {
- if(fence!=0)
- fence--;
- }
- template <class Elem>
- void AList<Elem>::next()
- {
- if(fence<=listSize)
- fence++;
- }
- template <class Elem>
- int AList<Elem>::leftLength()
- {
- return fence;
- }
- template <class Elem>
- int AList<Elem>::rightLength()
- {
- return (listSize-fence);
- }
- template <class Elem>
- bool AList<Elem>::setPos(int pos)
- {
- if((pos >= 0)&&(pos <=listSize))
- fence=pos;
- return ((pos >=0)&&(pos <=listSize));
- }
- template <class Elem>
- bool AList<Elem>::getValues(Elem& it)
- {
- if(listSize==0)
- return false;
- it=listArray[fence];
- return true;
- }
- template <class Elem>
- void AList<Elem>::print() const
- {
- int temp=0;
- cout<<"In AList:<";
- while(temp < fence)
- cout<<listArray[temp++]<<" ";
- cout<<"|";
- while(temp < listSize)
- cout<<listArray[temp++]<<" ";
- cout<<">\n";
- }