削除の方法の考え方は分かったのですが、
parentの親のポインタをparentpで表そうとしたらよくわからなくなってしまいました。
教えてもらえないでしょうか
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Name_Len 32
#define NumOfPhone 14
#define max_data 100000
typedef struct Node{
char name[Name_Len];
char phone[NumOfPhone];
struct Node *left;
struct Node *right;
}node;
int input_data(char file_name[], node **root, node *data){
int i = 0;
node *parent;
FILE *fp;
fp = fopen(file_name, "r");
if(fp == NULL){
printf("%sのファイルが開けません。\n",file_name);
exit (0);
}
else{
while (fscanf(fp, "%s%s", (data+i)->name, (data+i)->phone) == 2){
(data+i)->left = NULL;
(data+i)->right = NULL;
if (*root == NULL){
*root = data+i;
}
else{
parent = *root;
while(1){
if(strcmp((data+i)->name, parent->name) < 0){
if(parent->left == NULL){
parent->left = (data+i);
break;
}
else{
parent = parent->left;
}
}
else{
if(parent->right == NULL){
parent->right = (data+i);
break;
}
else
parent = parent->right;
}
}
}
}
i++;
}
}
return i;
}
int delete_data(char scname[], node **root){
node *parent, *parentp; //parentpは*parentの親を示す
node *tmp;
parent = *root;
while(1){
if(strcmp(scname, parent->name) == 0) break;
if(strcmp(scname, parent->name) < 0){
if(parent->left == NULL){
return ;
}
parent = parent->left;
}
else{
if(parent->right == NULL){
return ;
}
parent = parent->right;
}
return (parent);
}
while(parent != NULL){
if(strcmp(scname, parent->name) < 0){
parent = parent->left;
}
else{
parent = parent->right;
}
}
if(parent->right == NULL && parent->left == NULL){ //子を持たない時
if(parent == *root){
*root = NULL;
}
else{
if(parentp -> left == parent)
parentp -> left = NULL;
else
parentp ->right = NULL;
}
}
if(parent->right == NULL && parent->left != NULL){ //削除ノードが左子をもつ時
if(parent == *root){
*root = parent-> left;
*root ->parentp = NULL;
}
else {
if(parentp -> left == parent)
parentp -> left = parent->left;
else
parentp ->right = parent->left;
parent->left ->parentp = parentp;
}
}
if(parent->right != NULL && parent->left == NULL){ //削除ノードが右子をもつ時
if(parent== *root){
*root = parent->right;
*root -> parentp = NULL;
}
else {
if(parentp -> left == parent)
parentp -> left = parent -> right;
else
parentp -> right = parent->right;
parent -> right -> parentp = parent -> parentp;
}
}
if(parent->right != NULL && parent->left != NULL){ //両方に子をもつ時
tmp = parent->right; //右の子の左の子をたどる
while(tmp ->left){
tmp = tmp ->left;
parent->right = NULL;
parent = tmp;
}
}
}
int main(void){
int i;
int select = 0;
char file_name[64];
char scname[Name_Len];
node data[max_data];
node *root, *parent;
printf("ファイル名を入力してください。");
scanf("%s", file_name);
input_data(file_name, &root, &data[0]);
printf("削除する名前を入力してください。\n");
scanf("%s", scname);
deleat_data(scname);
return 0;
}