C++を実現する双方向循環チェーン表


本論文の例では、C++双方向循環チェーンの具体的なコードを共有しています。参考にしてください。具体的な内容は以下の通りです。
一、概念
1.ダブルリンク表の各ノードは、2つのリンクポインタが必要です。
 lLink->前駆の結点を指します。  (前駆ポインタまたは左鎖ポインタ)
rLink->後続の結点(後駆ポインタまたは右チェーンポインタ)を指します。
2.デュアルチェーンは常に付加的なヘッダ・ノードを持つ循環チェーンの方式を採用しています。
first:ヘッドポインタ、データを保存しない、または特別な要求のデータを保存します。そのlLinkは二重リンクの最後の結点を指しています。
そのrLinkは二重リンク表の最初の結点(最初の有効な結点)を指します。チェーンの最初の接合点の左チェーンの針lLinkと最後の接合点の右チェーンの針
rLinkは付加的な頭の結点を指します。
二、実現プログラム
1.DblList.h

#ifndef DblList_h
#define DblList_h
#include <iostream>
using namespace std;
 
template <class T>
struct DblNode { //       
 T data;
 DblNode<T> *lLink, *rLink; //     (  )   (  )  
 DblNode(DblNode<T> *left = NULL, DblNode<T> *right = NULL):lLink(left), rLink(right){} //     
 DblNode(T value, DblNode<T> *left = NULL, DblNode<T> *right = NULL):data(value), lLink(left), rLink(right){} //     
};
 
template <class T>
class DblList { //    (      )
public:
 DblList(); //     :       
 ~DblList(); //     :      
 void createDblList(); //       
 int Length()const; //         
 bool isEmpty(); //       
 DblNode<T> *getHead()const; //       
 void setHead(DblNode<T> *ptr); //          
 DblNode<T> *Search(const T x); //                 x   
 DblNode<T> *Locate(int i, int d); //        i   ,d=0     ,       
 bool Insert(int i, const T x, int d); //   i      x,d=0     ,       
 bool Remove(int i, T &x, int d); //    i   ,x      ,d=0     ,       
 void Output(); //          
private:
 DblNode<T> *first; //      
};
 
template <class T>
DblList<T>::DblList() {
 //     :       
 first = new DblNode<T>();
 if(NULL == first) {
  cerr << "          !" << endl;
  exit(1);
 }
 first->rLink = first->lLink = first; //     
}
 
template <class T>
DblList<T>::~DblList() { //     :      
 DblNode<T> *current = first->rLink;
 while(current != first) {
  current->rLink->lLink = current->lLink; //  lLink    
  current->lLink->rLink = current->rLink; //  rLink    
  delete current; //     
  current = first->rLink;
 }
 delete first;
 first = NULL;
}
 
template <class T>
void DblList<T>::createDblList() {
 //       
 int n, val;
 DblNode<T> *current = first;
 cout << "         n:";
 cin >> n;
 cout << "        :" << endl;
 for(int i = 0; i < n; i++) {
  cin >> val;
  DblNode<T> *newNode = new DblNode<T>(val);
  if(NULL == newNode) {
   cerr << "          !" << endl;
   exit(1);
  }
  //    
  while(current->rLink != first)
   current = current->rLink; //        
  newNode->rLink = current->rLink;
  current->rLink = newNode;
  newNode->rLink->lLink = newNode;
  newNode->lLink = current;
  current = current->rLink; // current   
 }
}
 
template <class T>
int DblList<T>::Length()const {
 //         
 DblNode<T> *current = first->rLink;
 int count = 0;
 
 while(current != first) {
  current = current->rLink;
  count++;
 }
 return count;
}
 
template <class T>
bool DblList<T>::isEmpty() {
 //       
 return first->rLink == first;
}
 
template <class T>
DblNode<T> *DblList<T>::getHead()const {
 //       
 return first;
}
 
template <class T>
void DblList<T>::setHead(DblNode<T> *ptr) {
 //          
 first = ptr;
}
 
template <class T>
DblNode<T> *DblList<T>::Search(const T x) {
 //                 x   
 DblNode<T> *current = first->rLink;
 while(current != first && current->data != x)
  current = current->rLink;
 if(current != first)
  return current; //     
 else //     
  return NULL;
}
 
template <class T>
DblNode<T> *DblList<T>::Locate(int i, int d) {
 //   
 if((first->rLink == first) || (i = 0))
  return first;
 DblNode<T> *current;
 if(d == 0)
  current = first->lLink; //       
 else
  current = first->rLink;
 for(int j = 1; j < i; j++)
 {
  if(current == first)
   break;
  else if(d == 0)
   current = current->lLink;
  else
   current = current->rLink;
 }
 if(current != first) //     
  return current;
 else
  return NULL;
}
 
template <class T>
bool DblList<T>::Insert(int i, const T x, int d) {
 //   
 DblNode<T> *current = Locate(i, d); //    i   
 if(current == NULL) // i   ,    
  return false;
 DblNode<T> *newNode = new DblNode<T>(x);
 if(newNode == NULL) {
  cerr << "        !" << endl;
  exit(1);
 }
 if(d == 0) { //       
  newNode->lLink = current->lLink;
  current->lLink = newNode;
  newNode->lLink->rLink = newNode;
  newNode->rLink = current;
 }
 else { //       
  newNode->rLink = current->rLink;
  current->rLink = newNode;
  newNode->rLink->lLink = newNode;
  newNode->lLink = current;
 }
 return true;
}
 
template <class T>
bool DblList<T>::Remove(int i, T &x, int d) {
 //   
 DblNode<T> *current = Locate(i, d); //    i   
 if(current == NULL) // i   ,    
  return false;
 current->rLink->lLink = current->lLink; //  lLink    
 current->lLink->rLink = current->rLink; //  rLink    
 x = current->data;
 delete current; //     
 current = NULL; //    
 return true; //     
}
 
template <class T>
void DblList<T>::Output() {
 //          
 DblNode<T> *current = first->rLink;
 while(current != first) {
  cout << current->data << " ";
  current = current->rLink;
 }
 cout << endl;
}
 
#endif /* DblList_h */
2.main.cpp

#include "DblList.h"
using namespace std;
 
int main(int argc, const char * argv[]) {
 int finished = 0, choice, i, x, d, len; // i   i ,d:     -》0      ,       
 DblList<int> L;
 DblNode<int> *head = NULL, *current;
 
 while(!finished) {
  cout << "
********* *********
"; cout << "1:
"; cout << "2:
"; cout << "3: ?
"; cout << "4:
"; cout << "5:
"; cout << "6: x
"; cout << "7: i ,d=0 ,
"; cout << "8: i x,d=0 ,
"; cout << "9: i ,x ,d=0 ,
"; cout << "10: :
"; cout << "11:
"; cout << " [1-11]:
"; cin >> choice; switch(choice) { case 1: L.createDblList(); // break; case 2: len = L.Length(); // cout << " :" << len << endl; break; case 3: if(L.isEmpty()) // cout << " " << endl; else cout << " " << endl; break; case 4: head = L.getHead(); break; case 5: L.setHead(head); // break; case 6: cout << " x:"; cin >> x; if(L.Search(x) != NULL) cout << " !" << endl; else cout << " !" << endl; break; case 7: cout << " i i d(d=0 , ):"; cin >> i >> d; current = L.Locate(i, d); if(current == NULL) cout << " !" << endl; else cout << " !" << endl; break; case 8: cout << " i x,d=0 , 。 i, x d:"; cin >> i >> x >> d; if(L.Insert(i, x, d)) cout << " !" << endl; else cout << " !" << endl; break; case 9: cout << " i ,x ,d=0 , 。 i d:"; cin >> i >> d; if(L.Remove(i, x, d)) cout << " , :" << x << endl; else cout << " !" << endl; break; case 10: cout << " :" << endl; L.Output(); break; case 11: finished = 1; break; default: cout << " , !" << endl; } // switch } // while return 0; }
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。