2014年4月24日木曜日

開発環境

C++実践プログラミング (スティーブ オウアルライン (著)、Steve Oualline (原著)、Steve Oualline(原著)、望月 康司(翻訳)、クイープ(翻訳) 、オライリー・ジャパン)のⅣ部(高度なプログラミング概念)の20章(高度なポインタ)、20.10(プログラミング実習)、実習 20-3.を解いてみる。

その他参考書籍

実習 20-3.

コード(BBEdit, Emacs)

double_linked.h

#include <iostream>

class double_list {
private:
  class double_list_element {
  public:
    int data;
  private:
    double_list_element *next_ptr;
    double_list_element *previous_ptr;
    friend class double_list;
  };
public:
  double_list_element *head_ptr;

  double_list() {head_ptr = NULL;}
  
  void enter(int item);
  void remove(int item);
  void p();
};

void double_list::enter(int item)
{
  std::cout << item << "を追加" << std::endl;
  double_list_element *new_ptr;
  
  new_ptr = new double_list_element;
  new_ptr->data = item;
  if (head_ptr == NULL) {
    new_ptr->next_ptr = NULL;
    new_ptr->previous_ptr = NULL;
    head_ptr = new_ptr;
  }
  else {
    double_list_element *insert_ptr;

    insert_ptr = head_ptr;
    while (true) {
      if (insert_ptr->next_ptr == NULL && item > insert_ptr->data) {        
        new_ptr->next_ptr = NULL;
        new_ptr->previous_ptr = insert_ptr;
        insert_ptr->next_ptr = new_ptr;
        if (insert_ptr->previous_ptr == NULL)
          head_ptr = insert_ptr;
         break;
      }
      if (item <= insert_ptr->data) {
        new_ptr->next_ptr = insert_ptr;
        new_ptr->previous_ptr = insert_ptr->previous_ptr;
        if (insert_ptr->previous_ptr != NULL)
          insert_ptr->previous_ptr->next_ptr = new_ptr;
        insert_ptr->previous_ptr = new_ptr;
        if (new_ptr->previous_ptr == NULL)
          head_ptr = new_ptr;
        break;
      }
      insert_ptr = insert_ptr->next_ptr;
    }
  }
}

void double_list::remove(int item)
{
  std::cout << item << "を削除" << std::endl;
  double_list_element *current_ptr;
  
  current_ptr = head_ptr;
  while (true) {
    if (current_ptr == NULL)
      break;
    if (item == current_ptr->data) {
      if (current_ptr == head_ptr) {
        head_ptr = current_ptr->next_ptr;
        if (head_ptr != NULL)
          head_ptr->previous_ptr = NULL;
      }
      else {
        current_ptr->previous_ptr->next_ptr = current_ptr->next_ptr;
        current_ptr->next_ptr->previous_ptr = current_ptr->previous_ptr;
      }
      delete current_ptr;
      current_ptr = NULL;
      break;
    }
    current_ptr = current_ptr->next_ptr;
  }
}

void double_list::p()
{
  std::cout << "二重リンクリスト" << std::endl;
  double_list_element *current_ptr;
  double_list_element *last_ptr;

  current_ptr = head_ptr;
  last_ptr = head_ptr;
  
  std::cout << "昇順: ";
  while (current_ptr != NULL) {
    last_ptr = current_ptr;
    std::cout << current_ptr->data << ' ';
    current_ptr = current_ptr->next_ptr;
  }
  std::cout << std::endl << "降順: ";
  current_ptr = last_ptr;
  while (current_ptr != NULL) {
    std::cout << current_ptr->data << ' ';
    current_ptr = current_ptr->previous_ptr;
  }
  std::cout << std::endl;
}

test_double_linked.cpp

#include "double_linked.h"

int main(int argc, char *argv[])
{
  double_list dl;
  int nums[] = {10, 2, 8, 10, 4, 6};
  int i;

  dl.p();

  for (i = 0; i < 6; ++i) {
    dl.enter(nums[i]);
    dl.p();
  }

  for (i = 1; i <= 10; ++i) {
    dl.remove(i);
    dl.p();
  }
  
  dl.remove(10);
  dl.p();
  
  dl.remove(100);
  dl.p();
  
  return (0);
}

Makefile

CC=g++
CFLAGS=-g -Wall
all: test_double_linked

test_double_linked: test_double_linked.cpp double_linked.h
 ${CC} ${CFLAGS} -o test_double_linked test_double_linked.cpp

clean:
 rm test_double_linked

入出力結果(Terminal)

$ make && ./test_double_linked
g++ -g -Wall -o test_double_linked test_double_linked.cpp
二重リンクリスト
昇順: 
降順: 
10を追加
二重リンクリスト
昇順: 10 
降順: 10 
2を追加
二重リンクリスト
昇順: 2 10 
降順: 10 2 
8を追加
二重リンクリスト
昇順: 2 8 10 
降順: 10 8 2 
10を追加
二重リンクリスト
昇順: 2 8 10 10 
降順: 10 10 8 2 
4を追加
二重リンクリスト
昇順: 2 4 8 10 10 
降順: 10 10 8 4 2 
6を追加
二重リンクリスト
昇順: 2 4 6 8 10 10 
降順: 10 10 8 6 4 2 
1を削除
二重リンクリスト
昇順: 2 4 6 8 10 10 
降順: 10 10 8 6 4 2 
2を削除
二重リンクリスト
昇順: 4 6 8 10 10 
降順: 10 10 8 6 4 
3を削除
二重リンクリスト
昇順: 4 6 8 10 10 
降順: 10 10 8 6 4 
4を削除
二重リンクリスト
昇順: 6 8 10 10 
降順: 10 10 8 6 
5を削除
二重リンクリスト
昇順: 6 8 10 10 
降順: 10 10 8 6 
6を削除
二重リンクリスト
昇順: 8 10 10 
降順: 10 10 8 
7を削除
二重リンクリスト
昇順: 8 10 10 
降順: 10 10 8 
8を削除
二重リンクリスト
昇順: 10 10 
降順: 10 10 
9を削除
二重リンクリスト
昇順: 10 10 
降順: 10 10 
10を削除
二重リンクリスト
昇順: 10 
降順: 10 
10を削除
二重リンクリスト
昇順: 
降順: 
100を削除
二重リンクリスト
昇順: 
降順: 
$

0 コメント:

コメントを投稿