<問題文>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);
}