链表的模板实现

来源:互联网 发布:极致追击 知乎 编辑:程序博客网 时间:2024/06/13 12:32
//链表的模板实现 //By KiRa 07/08/28#include <iostream>using namespace std;/*Length = 0IsEmpty = 1List is 2  6IsEmpty = 0First element is 2Length = 2Deleted element is 2List 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;}