链表的模板实现

//链表的模板实现 
//By KiRa 07/08/28

#include <iostream>
using namespace std;

/*
Length = 0
IsEmpty = 1
List is 2  6
IsEmpty = 0
First element is 2
Length = 2
Deleted element is 2
List is 6
*/


class OutOfBounds {
   public:
      OutOfBounds() {}
};

template <class T> class ChainIterator;
template <class T> class Chain;
template <class T> class KeyedChain;
template <class T> class LinkedStack;

template <class T>
class ChainNode {
   friend class Chain<T>;
   friend class ChainIterator<T>;
   friend class KeyedChain<T>;
   friend class LinkedStack<T>;
   private:
      T data;
      ChainNode<T> *link;
};

template<class T>
class Chain {
   friend class ChainIterator<T>;
   public:
      Chain() {first = 0;}
      ~Chain();
      bool IsEmpty() const {return first == 0;}
      int Length() const; 
      bool Find(int k, T& x) const; 
      int Search(const T& x) const; 
      Chain<T>& Delete(int k, T& x); 
      Chain<T>& Insert(int k, const T& x);
      void Output(ostream& out) const;
   private:
      ChainNode<T> *first;
};

template<class T>
Chain<T>::~Chain()
{
   ChainNode<T> *next; 
   while (first) {
      next = first->link;
      delete first;
      first = next;
      }
}

template<class T>
int Chain<T>::Length() const
{
   ChainNode<T> *current = first;
   int len = 0;
   while (current) {
     len++;
     current = current->link;
     }
   return len;
}

template<class T>
bool Chain<T>::Find(int k, T& x) const
{
   if (k < 1) return false;
   ChainNode<T> *current = first;
   int index = 1; 
   while (index < k && current) ...{
      current = current->link;
      index++;
      }
   if (current) {x = current->data;
                 return true;}
   return false;
}

template<class T>
int Chain<T>::Search(const T& x) const
{
   ChainNode<T> *current = first;
   int index = 1;
   while (current && current->data != x) {
      current = current->link;
      index++;
      }
   if (current) return index;
   return 0;
}

template<class T>
Chain<T>& Chain<T>::Delete(int k, T& x)
{
   if (k < 1 || !first)
      throw OutOfBounds();
   
   ChainNode<T> *p = first;

   if (k == 1) 
      first = first->link; 
   else { 
      ChainNode<T> *q = first;
      for (int index = 1; index < k - 1 && q;
                          index++)
         q = q->link;
      if (!q || !q->link)
         throw OutOfBounds(); 
      p = q->link; 
      q->link = p->link;} 

   x = p->data;
   delete p;
   return *this;
}

template<class T>
Chain<T>& Chain<T>::Insert(int k, const T& x)
{
   if (k < 0) throw OutOfBounds();

   ChainNode<T> *p = first;
   for (int index = 1; index < k && p;
                       index++)  
      p = p->link;
   if (k > 0 && !p) throw OutOfBounds();

   ChainNode<T> *y = new ChainNode<T>;
   y->data = x;
   if (k) {
           y->link = p->link;
           p->link = y;}
   else {
         y->link = first;
         first = y;}
   return *this;
}

template<class T>
void Chain<T>::Output(ostream& out) const
{
   ChainNode<T> *current;
   for (current = first; current;
                         current = current->link)
      out << current->data << "  ";
}

template <class T>
ostream& operator<<(ostream& out, const Chain<T>& x)
 {x.Output(out); return out;}
   
   
int main(void)
{
   try {
      Chain<int> L;
      cout << "Length = " << L.Length() << endl;
      cout << "IsEmpty = " << L.IsEmpty() << endl;
      L.Insert(0,2).Insert(1,6);
      cout << "List is " << L << endl;
      cout << "IsEmpty = " << L.IsEmpty() << endl;
      int z;
      L.Find(1,z);
      cout << "First element is " << z << endl;
      cout << "Length = " << L.Length() << endl;
      L.Delete(1,z);
      cout << "Deleted element is " << z << endl;
      cout << "List is " << L << endl;
      }
   catch (...) {
      cerr << "An exception has occurred" << endl;
      }
   
   cin.get();
   return EXIT_SUCCESS;
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值