2分探索木での最短経路出力

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
User

2分探索木での最短経路出力

#1

投稿記事 by User » 13年前

質問です。

<問題文>2分探索木を使って駅の乗り換え案内の最短経路出力するプログラムを作成せよ。
問題文の入力として出発駅、出発時刻、目的駅の3つを入力として受け取る。出力は目的駅までの最短経路と到着時間。

また、上記のプログラムを改変して出発駅を最も遅く出発して、目的駅に到着希望時刻までに到着する経路を出力するプログラムを作成せよ。

↑の問題のプログラムが作れなくて困っています。
自分で途中まで作ったコードを貼るのでアドバイスをくれるとうれしいです。

コード:

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

#define NO     1
#define NAME   2

typedef enum{
  Term,Insert,Search,
} Menu;

/*電車データ*/
typedef struct{
  double no;
  char name[100];
}Data;

/*node*/
 typedef struct __bnode{
   double             data;       /*データ*/
   struct __bnode  *left;       /*左の子のnodeへのポインタ*/
   struct __bnode  *right;      /*右の子のnodeへのポインタ*/
 }BinNode;

/*データの駅名を比較*/
double NameCmp(double x,double y)
{
  return (strcmp(x.name,y.name));
}

/*1つのnodeを動的に確保*/
BinNode *AllocNode(void)
{
  return ((BinNode *)calloc(1,sizeof(BinNode)));
}

/*nodeの各メンバに値を設定*/
void SetBinNode(BinNode *p,double x,BinNode *left,BinNode *right)
{
  p->data = x;            /*データ*/
  p->left = left;         /*左の子nodeへのポインタ*/
  p->right = right;       /*右の子nodeへのポインタ*/
}

/*駅名による探索*/
BinNode *SearchNode(BinNode *p,double x)
{
  int cond;

  if(p == NULL)        
    return(NULL);       /*探索失敗*/
  else if((cond = NameCmp(x, p->data)) == 0)
    return(p);          /*探索成功*/
  else if(cond < 0)
    SearchNode(p->left, x);    /*左部分木から探索*/
  else
    SearchNode(p->right, x);   /*右部分木から探索*/
}

/*nodeを挿入*/
BinNode *InsertNode(BinNode *p,double x)
{
  int cond;

  if(p == NULL){
    p = AllocNode();
    SetBinNode(p,x,NULL,NULL);
  }else if((cond = NameCmp(x,p->data)) == 0)
    printf("「エラー」%s は既に登録されています。\n",x.name);
  else if(cond < 0)
    p->left = InsertNode(p->left,x);
  else
    p->right = InsertNode(p->right,x);
  return(p);
}

/*時刻と駅名を表示*/
void PrintData(double x)
{
  printf("時刻: %d 駅名: %s\n",x.no,x.name);
}


/*全nodeを解放*/
void FreeTree(BinNode *p)
{
  if(p != NULL){
    FreeTree(p->left);
    FreeTree(p->right);
    free(p);
  }
}



/*データの入力*/
double Read(char *message,double sw)
{
  double temp;

  printf("%sするデータを入力してください。\n",message);

 if(sw & NO) { printf("時刻:"); scanf("%d",&temp.no);} 
 if(sw & NAME) { printf("電車名:"); scanf("%s",temp.name);}
 

  return(temp);
}

/*メニュー選択*/
Menu SelectMenu(void)
{
  int ch;

  do{
    printf("\n(1)挿入 (2)探索  (0)終了:");
    scanf("%d",&ch);
  }while(ch<Term || ch>Search);

  return((Menu)ch);
}

/*メイン関数*/
int main(void)
{
  Menu    menu;
  BinNode *root;
 
  root = NULL;

  do{
    double x;
    BinNode  *temp;

    switch(menu = SelectMenu()){
    case Insert : x = Read("挿入", NO | NAME);
      root = InsertNode(root,x);
      break; 


    case Search : x = Read("探索",NAME);
      if((temp = SearchNode(root, x)) != NULL)
	PrintData(temp->data);  
      break;

    }
  }while (menu != Term);

  FreeTree(root);

  return(0);
}

box
記事: 2002
登録日時: 15年前

Re: 2分探索木での最短経路出力

#2

投稿記事 by box » 13年前

ほんの一部しか見ていませんが…。
User さんが書きました:

コード:

/*データの駅名を比較*/
double NameCmp(double x,double y)
{
  return (strcmp(x.name,y.name));
}
この関数の戻り値の型がdoubleである理由がわかりません。strcmp()の戻り値の型はintだったような気がします。

それから、引数のxとかyとかはdouble型の数値なんですか?それとも何かの構造体なんですか?
それぞれにnameというメンバーが属しているところを見ると構造体であるように見えますが、
引数のところを見ると単なるdouble型に見えます。どっちなんでしょうか?

ご自分の中で、本当に何がしたいのか、整理できていますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る