⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 echain.h

📁 一本全面剖析C++数据结构算法的书籍
💻 H
字号:
// file echain.h// extended chain#ifndef Chain_#define Chain_#include <iostream.h>#include "cnode.h"#include "xcept.h"template <class T> class ChainIterator;template<class T>class Chain {   friend  ChainIterator<T>;   public:      Chain() {first = 0;}      ~Chain() {Erase();}       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 Zero() {first = 0;}      void Erase(); // delete all nodes      Chain<T>& Append(const T& x);      void Output(ostream& out) const;   private:      ChainNode<T> *first,  // pointer to first node                   *last;   // pointer to last node};template<class T>void Chain<T>::Erase(){// Chain destructor. Delete all nodes in chain.   ChainNode<T> *next;   while (first) {      next = first->link;      delete first;      first = next;      }}template<class T>int Chain<T>::Length() const{// Return the number of elements in the chain.   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{// Set x to the k'th element in the chain. // Return false if no k'th; return true otherwise.   if (k < 1) return false;   ChainNode<T> *current = first;   int index = 1;  // index of current   while (index < k && current) {      current = current->link;      index++;      }   if (current) {x = current->data;                 return true;}   return false; // no k'th element}template<class T>int Chain<T>::Search(const T& x) const{// Locate x.  Return position of x if found. // Return 0 if x not in the chain.   ChainNode<T> *current = first;   int index = 1;  // index of current   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){// Set x to the k'th element and delete it. // Throw OutOfBounds exception if no k'th element.   if (k < 1 || !first)      throw OutOfBounds(); // no k'th      // p will eventually point to k'th node   ChainNode<T> *p = first;   // move p to k'th & remove from chain   if (k == 1) // p already at k'th      first = first->link; // remove   else { // use q to get to k-1'st      ChainNode<T> *q = first;      for (int index = 1; index < k - 1 && q;                          index++)         q = q->link;      if (!q || !q->link)         throw OutOfBounds(); // no k'th      p = q->link; // k'th      if (p == last) last = q;      q->link = p->link;} // remove from chain   // save k'th element and free node p   x = p->data;   delete p;   return *this;}template<class T>Chain<T>& Chain<T>::Insert(int k, const T& x){// Insert x after the k'th element. // Throw OutOfBounds exception if no k'th element. // Pass NoMem exception if inadequate space.   if (k < 0) throw OutOfBounds();   // p will eventually point to k'th node   ChainNode<T> *p = first;   for (int index = 1; index < k && p;                       index++)  // move p to k'th      p = p->link;   if (k > 0 && !p) throw OutOfBounds(); // no k'th   // insert   ChainNode<T> *y = new ChainNode<T>;   y->data = x;   if (k) {// insert after p           y->link = p->link;           p->link = y;}   else {// insert as first element         y->link = first;         first = y;}   if (!y->link) last = y; // new last element   return *this;}template<class T>Chain<T>& Chain<T>::Append(const T& x){// Add at right end.   ChainNode<T> *y;   y = new ChainNode<T>;   y->data = x; y->link = 0;   if (first) {// chain is not empty               last->link = y;               last = y;}   else // chain is empty        first = last = y;   return *this;}template<class T>void Chain<T>::Output(ostream& out) const{// Insert the chain elements into the stream out.   ChainNode<T> *current;   for (current = first; current;                         current = current->link)      out << current->data << "  ";}// overload <<template <class T>ostream& operator<<(ostream& out, const Chain<T>& x)   {x.Output(out); return out;}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -