您的位置:首页 > 编程语言 > C语言/C++

练习C/C++基本功(列表和迭代器的实现和测试)

2006-10-29 14:31 309 查看
练习C/C++基本功(列表和迭代器的实现和测试)

#include "stdafx.h"
#include <iostream>
#include "stdlib.h"
#include "stdio.h"
#include "time.h"

using namespace std;
long DEFAULT_LIST_CAPACITY = 30;

template <class Item> class List
{
public:
  List ( long size = DEFAULT_LIST_CAPACITY )
  {
      arr=new Item[size]; 
      this->count=0;
  }

  List ( List& ls )
  {
      if(ls.arr)
          delete arr;
      arr=new Item[ls.count];
      for(int i=0;i<ls.count;i++)
          arr[i]=ls.arr[i];
      this->count=ls.count;
  }  
  
  ~List ( )
  {
      if(arr)
         delete []arr;
      arr=NULL;
  }

  List operator = ( const List& ls )
  {
      if(this=&ls)
         return *this;
      if(ls.arr)
         delete arr;
      arr=new Item[ls.count];
      for(int i=0;i<ls.count;i++)
         arr[i]=ls.arr[i];
      this->count=ls.count;
  }

  long Count ( ) const
  {
      return this->count;
  }

  Item& Get ( long index ) const
  {
       return arr[index]; 
  }
  
  Item& First ( ) const
  {
       return arr[0];
  }
  
  Item& Last ( ) const
  {
       return arr[this->count-1];
  }

  bool Includes ( const Item& item) const
  {
       for(int i=0;i<this->count;i++)
          if(item==arr[i])
              return true;
       return false;
  }
        
  void Append ( const Item& item)
  {
       Item* temp=new Item[this->count+1];
       for(int i=0;i<this->count;i++)
           temp[i]=arr[i];
       temp[i+1]=item;
       delete []arr;
       arr=temp;
       this->count++;
  }
  
  void Prepend ( const Item& item)
  {
       Item* temp=new Item[this->count+1];
       for(int i=1;i<this->count+1;i++)
          temp[i]=arr[i];
       temp[0]=item;
       delete []arr;
       arr=temp;
       this->count++;
  }

  void Remove ( const Item& item)
  {
       Item* temp=new Item[count-1];
       for(int i=0;i<this->count;i++)
          if(item==arr[i])
          {
              i++;
          }
          else
          {
              temp[i]=arr[i];
          }
       delete []arr;
       arr=temp;
       this->count--;
  }
  
  void RemoveLast ( const Item& )
  {
      Item* temp=new Item[count-1];
      for(int i=0;i<count-1;i++)
          temp[i]=arr[i];
      count--;
  }

  void RemoveFisrt ( const Item& )
  {
      Item* temp=new Item[count-1];
      for(int i=0;i<count-1;i++)
         temp[i]=arr[i+1];
      count--;
  }

  void RemoveAll ( const Item& )
  {
      delete []arr;
      arr=NULL;
      count=0;
  }

  Item& Top ( ) const
  {
      return arr[0];
  }

  void Push ( const Item& item )
  {
      Item* temp=new Item[count+1];
      for(int i=0;i<count;i++)
         temp[i]=arr[i];
      temp[i+1]=item;
      count++;
  }

  Item& Pop ()
  {
      Item* temp=new Item[count-1];
      Item item=arr[0];
      for(int i=0;i<count-1;i++)
          temp[i]=arr[i+1];
      delete arr;
      arr=temp;
      return item;
  }

private:
  Item* arr;
  int count;
};

template <class Item> class Iterator 
{
public:
            virtual void First ( ) = 0;
            virtual void Next ( ) = 0;
            virtual bool IsDone ( ) const = 0;
            virtual Item CurrentItem ( ) const = 0;
protected:
   Iterator ( ) {}
};

template <class Item> class ListIterator : public Iterator<Item> 
{
public:
    ListIterator(const List<Item>* aList);
    virtual void First();
    virtual void Next();
    virtual bool IsDone() const;
    virtual Item CurrentItem() const;
private:
    const List<Item>* _list;
    long _current;
};

template <class Item>
ListIterator<Item>::ListIterator ( const List<Item>* aList ) : _list(aList), _current(0) { }

template <class Item>
void ListIterator<Item>::First () { _current = 0; }

template <class Item>
void ListIterator<Item>::Next () 
{
        _current++;
}

template <class Item>
bool ListIterator<Item>::IsDone () const { return _current >= _list->Count(); }

template <class Item>
Item ListIterator<Item>::CurrentItem () const 
{
    if (IsDone()) 
        {
        throw "IteratorOutOfBounds";
    }
    return _list->Get(_current);
}

class Item
{
public:
 Item():a(0)
 {

 }

 Item(int a)
 {
     this->a=a;
 }

 bool operator!=(const Item& item)
 {
     if(this->a!=item.a)
         return true;
     else
         return false;
 }

friend ostream& operator<<(ostream& os,const Item& item)
 {
     os<<item.a<<" ";
     return os;
 }
private:
   int a;
};

int main(int argc, char* argv[])
{
 
     List<Item>* ls=new List<Item>(10);
     ListIterator<Item> itor(ls);
     for(int i=0;i<10;i++)
     {
         Item item(i);
         ls->Prepend(item);
     }
     while(!itor.IsDone())
     {
         cout<<itor.CurrentItem();
         itor.Next();
     }

     return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: