2017年12月19日火曜日

開発環境

Head First C ―頭とからだで覚えるCの基本 (David Griffiths (著)、Dawn Griffiths (著)、中田 秀基 (監修)、木下 哲也 (翻訳)、オライリージャパン)の6章(データ構造と動的メモリ - 架け橋を築く)、大きな疑問(p. 305)を取り組んでみる。

大きな疑問(p. 305)

コード

#include <stdlib.h> // system
#include <stdio.h>
#include <string.h>

typedef struct Node
{
 char *question;
 struct Node *no;
 struct Node *yes;
} Node;

bool yes_no(char *question)
{
 char answer[3];
 printf("%s? (y/n): ", question);
 fgets(answer, 3, stdin);
 return answer[0] == 'y';
}

Node *node_new(char *question)
{
 Node *n = (Node *)malloc(sizeof(Node));
 n->question = _strdup(question);
 n->no = NULL;
 n->yes = NULL;
 return n;
}

void release(Node *n)
{
 if (n)
 {
  if (n->no)
   release(n->no);
  if (n->yes)
   release(n->yes);
  if (n->question)
   free(n->question);
  free(n);
 }
}

int main()
{
 char question[80];
 char suspect[20];
 Node *start_node = node_new("question1");
 start_node->no = node_new("person1");
 start_node->yes = node_new("person2");

 Node *current;
 do
 {
  current = start_node;
  for (;;)
  {
   if (yes_no(current->question))
   {
    /* */
   }
   else if (current->no)
   {
    current = current->no;
   }
   else
   {
    printf("容疑者は? ");
    fgets(suspect, 20, stdin);
    Node *yes_node = node_new(suspect);
    current->yes = yes_node;

    Node *no_node = node_new(current->question);
    current->no = no_node;

    printf("%s, %s? ", suspect, current->question);
    fgets(question, 80, stdin);
    /* 置き換える前に解放 */
    free(current->question);
    current->question = _strdup(question);

    break;
   }
  }
 } while (yes_no("??"));
 release(start_node);

 system("pause");
 return 0;
}

入出力結果(コマンドプロンプト)

question1? (y/n): n
person1? (y/n): n
容疑者は? person3
person3
, person1? question2
??? (y/n): n
続行するには何かキーを押してください . . .

0 コメント:

コメントを投稿