どのように修正したらよいでしょうか
#include "stdafx.h"
#include <stdlib.h>
#include <string.h>
#pragma warning (disable:4996)
struct tnode {
struct tnode *left;
char name[256];
struct tnode *right;
};
typedef struct tnode NODE;
NODE *Search(NODE *p, char *dat);
void Del(NODE *p);
NODE *gentree(NODE *, char *);
void treewalk(NODE *);
NODE *talloc(void);
int main()
{
char dat[256], command[256];
NODE *root;
root = NULL;
while (1) {
printf("command: ");
scanf("%s", command);
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 = Search(root, dat);
break;
case 'q': // プログラム終了
exit(0);
break;
default: // ヘルプ表示
printf("i: input / w: walk / ");
printf("d: delete\n");
}
}
}
NODE *Search(NODE *p, char *dat)
{
if (p == NULL) return p;
if (strcmp(dat, p->name) == 0) {
Del(p);
return NULL;
}
if (strcmp(dat, p->name) < 0) {
p->left = Search(p->left, dat);
return p;
}
else {
p->right = Search(p->right, dat);
return p;
}
}
void Del(NODE *p)
{
NODE *sp;
sp = NULL;
if ((p->right == NULL)&&(p->left == NULL)) {
free(p),p=NULL;
}
if ((p->right !=NULL && p->left != NULL)) {
sp = p->right;
if (sp->left == NULL) {
sp->left = p->left;
sp = p;
p=p->right;
free(sp);
}
else {
while (sp->left->left != NULL)sp = sp->left;
sp->left->left = p;
p = sp->left;
sp->left = p->right;
p->right = p->left->right;
sp = p->left;
p->left = p->left->left;
}
}
else {
sp = p;
if (p->left != NULL)p = p->left,free(sp);
else if (p->right != NULL)p = p->right,free(sp);
}
}
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;
}
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;
}
ノードのデリートは以下の部分です
void Del(NODE *p)
{
NODE *sp;
sp = NULL;
if ((p->right == NULL)&&(p->left == NULL)) {
free(p),p=NULL;
}
if ((p->right !=NULL && p->left != NULL)) {
sp = p->right;
if (sp->left == NULL) {
sp->left = p->left;
sp = p;
p=p->right;
free(sp);
}
else {
while (sp->left->left != NULL)sp = sp->left;
sp->left->left = p;
p = sp->left;
sp->left = p->right;
p->right = p->left->right;
sp = p->left;
p->left = p->left->left;
}
}
else {
sp = p;
if (p->left != NULL)p = p->left,free(sp);
else if (p->right != NULL)p = p->right,free(sp);
}
}