第五回-03 : リストの実装と利用

前ページで紹介したリストの実現法 とその利用法をこのページでは紹介する。


リストの実現

それでは、list クラスのソースコードを以下に挙げる。 ここでの list クラスは int 型の変数を格納できるものとする。

#include <iostream>
using namespace std;

class node{
  public:
    node* left;
    node* right;

    int data;

    node(){ left=right=0; } // デフォルトコンストラクタ
    node (node* l, node* r, int d){ left=l; right=r; data=d;};  // 引数つき

    void printData(){ cout << data << "\n"; };

    friend class list;
};

class list{  
    node* root;
    node* last;
  public:
    list();  // デフォルトコンストラクタ
    ~list(); // デストラクタ

    void insertRoot(int d);
    void insertLast(int d);

    int getLastValue();

    void printAll();

};

// デフォルトコンストラクタ
list::list(){

  root = 0;
  last = 0;  // ヌルポインタで初期化

}

// デストラクタ
list::~list(){

  node *nl;
  node *nr;

  nl=root;
  while(nl!=0){
    nr = nl->right;
    delete nl;
    nl = nr;
  }

}

void list::insertRoot(int d){

  if(last==0){  // root==0 でもよい

    root = new node(0,0,d);  // last = new node(0,0,d); root = last; でも同じ
    last = root;

  }else{

    root->left = new node(0,root,d);  // 新たな node を root の左側に
    root = root->left;                // root ポインタのつけ変え

  }

}

void list::insertLast(int d){

  if(last==0){  // last に node がない (同時に root にも node がない)

    last = new node(0,0,d);
    root = last;

  }else{

    last->right = new node(last,0,d);  // 新たな node を last の右側に
    last = last->right;                // last ポインタのつけ変え

  }
}

int list::getLastValue(){

  if(last != 0){ // ヌルポインタでなかったら
    return(last->data);
  }else{
    return(0);
  }

}

void list::printAll(){

  node *n;
  n=root;
  while(n!=0){
    n->printData();
    n=n->right;
  }

}

int main(){

  list l;

  for(int i=0 ; i<10 ; i++){
    l.insertLast(i);
  }

  l.printAll();

  return(0);
}


やや長いがひとまず実行してみよう。

0~9 の数字が改行されて出力されるであろう。 これは、main 関数中の

  for(int i=0 ; i<10 ; i++){
    l.insertLast(i);
  }


によってリストの末尾にデータが挿入され、

  l.printAll();


によってリストの全データが出力されたのである。
list クラスはいくつかのメンバ関数を持つが、ポイントとなる 関数を以下の模式図で表す。



先頭への挿入を行う insertRoot(int i)、 末尾への挿入を行う insertLast(int i)、 last ポインタが指すノードのデータを取り出す int getLastValue() などである。

ここで、insertLast 関数の解説を行おう。プログラム全体を見ると長くて複雑に見えるかもしれないが、
一つ一つを見てゆくと、全て今まで習った知識のみで書けることがわかるはずである。

void list::insertLast(int d){

  if(last==0){  // last に node がない (同時に root にも node がない)

    last = new node(0,0,d);
    root = last;

  }else{

    last->right = new node(last,0,d);  // 新たな node を last の右側に
    last = last->right;                // last ポインタのつけ変え

  }
}


insertLast 関数は、既に node が存在するかどうかで if 文で分岐している。 全ての命令に対応する解説図を下に示した。
0 を指している矢印はヌルポインタを表す。この図をもとに insertLast 関数を理解してみよ。







←第五回-02 : リストの概念第五回-04 : 二分木の概念→

第五回トップページへ

クラスから入る C++ へ戻る