//链表的模板实现

来源:互联网 发布:淘宝炉石60包专店 编辑:程序博客网 时间:2024/06/05 04:44
//链表的模板实现 
//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& outconst;
   
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 < 1return 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> *= first;

   
if (k == 1
      first 
= first->link; 
   
else { 
      ChainNode
<T> *= first;
      
for (int index = 1; index < k - 1 && q;
                          index
++)
         q 
= q->link;
      
if (!|| !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 < 0throw OutOfBounds();

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

   ChainNode
<T> *= 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& outconst
{
   ChainNode
<T> *current;
   
for (current = first; current;
                         current 
= current->link)
      
out << current->data << "  ";
}

template 
<class T>
ostream
& operator<<(ostream& outconst 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;
}
原创粉丝点击