課題なのですが
Posted: 2016年1月12日(火) 20:56
以下のソースコードの★★★の部分に追加ソースを挿入してかんせいさせたいのですが、どのようなコードを追加すればよいのでしょうか?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct tnode {
struct tnode *left;
char name[256];
struct tnode *right;
};
// ノード構造体を NODE型と再定義
typedef struct tnode NODE;
NODE *SearchAndDestroy(NODE *p, char *dat);
void DeleteTree(NODE *p);
NODE *gentree(NODE *, char *);
void treewalk(NODE *);
NODE *talloc(void);
int main(int argc, char *argv[])
{
char dat[256], command[256];
NODE *root;
root = NULL;
while(1) {
printf("command: ");
scanf("%s", command);
// コマンド文字列の1文字目により場合分け
switch(command[0]) {
case 'i': // 1ノードの追加
printf("Name? ");
scanf("%s", dat);
root = gentree(root, dat);
break;
case 'w': // 木のトラバーサル
printf("Tree:\n");
treewalk(root);
break;
case 'd': // 部分木の削除
printf("Name? ");
scanf("%s", dat);
root = SearchAndDestroy(root, dat);
break;
case 'q': // プログラム終了
exit(0);
break;
default: // ヘルプ表示
printf("i: input / w: walk / ");
printf("d: delete\n");
}
}
}
//
// 削除対象部分木の根ノードの探索と削除関数の起動
//
// [引数]
// p: 起点ノードへのポインタ
// dat: 削除対象部分木の根ノードのデータ
// [戻り値]
// p が NULLのとき:NULL
// p 以下を削除したとき:NULL
// それ以外:p をそのまま返す
//
NODE *SearchAndDestroy(NODE *p, char *dat)
{
if (p == NULL) return p;
if (strcmp(dat, p->name) == 0) {
DeleteTree(p);
return NULL;
}
if (strcmp(dat, p->name) < 0) {
p->left = SearchAndDestroy(p->left, dat);
return p;
}
else {
p->right = SearchAndDestroy(p->right, dat);
return p;
}
}
//
// 特定ノードを根とする部分木の削除
//
// [引数]
// p: 起点ノードへのポインタ
// [戻り値]
// なし
//
void DeleteTree(NODE *p)
{
★★★★★★★★★★★★
}
//
// ノード追加
//
// [引数]
// p: 起点ノードへのポインタ
// w: 記入するデータ
// [戻り値]
// ノード作成時:作成したノード
// それ以外:p をそのまま返す
//
NODE *gentree(NODE *p, char w[])
{
if (p == NULL) {
p = talloc();
strcpy(p->name, w);
p->left = p->right = NULL;
}
else if (strcmp(w, p->name) < 0)
p->left = gentree(p->left, w);
else
p->right = gentree(p->right, w);
return p;
}
//
// 木のトラバーサル
//
// [引数]
// p: 起点ノード
// [戻り値]
// なし
//
void treewalk(NODE *p)
{
if (p != NULL) {
treewalk(p->left);
printf("%s\n", p->name);
treewalk(p->right);
}
}
//
// ノード新規作成
//
// [引数]
// なし
// [戻り値]
// 作成したノードへのポインタ
//
NODE *talloc(void)
{
NODE *p;
p = (NODE *)malloc(sizeof(NODE));
if (p == NULL) {
fprintf(stderr,
"Cannot allocate memory.\n");
exit(1);
}
return p;
}