回答編集履歴
7
コード追加
test
CHANGED
@@ -13,3 +13,82 @@
|
|
13
13
|
n = strcmp(target_node->name, add_node->name) を行おうとすれば、 target_node->name はアクセスできません。
|
14
14
|
|
15
15
|
ついでに、 main の do-while ループの条件に使っている answer と、追加するかの入力で使っている answer は、スコープが違う別変数です。
|
16
|
+
|
17
|
+
---
|
18
|
+
malloc を使うなら、同時に free も作っておいたほうが良いです。
|
19
|
+
結果確認用の表示も必要でしょう。
|
20
|
+
```c
|
21
|
+
#include <stdio.h>
|
22
|
+
#include <string.h>
|
23
|
+
#include <stdlib.h>
|
24
|
+
|
25
|
+
#define BUFSIZE 1024
|
26
|
+
|
27
|
+
typedef struct node {
|
28
|
+
char name[BUFSIZE];
|
29
|
+
char cellnumb[BUFSIZE];
|
30
|
+
struct node *left, *right;
|
31
|
+
} Node;
|
32
|
+
|
33
|
+
Node *addData(Node *target_node, Node *add_node) {
|
34
|
+
if(target_node == NULL) {
|
35
|
+
target_node = malloc(sizeof(Node));
|
36
|
+
memcpy(target_node, add_node, sizeof(Node));
|
37
|
+
//printf("%s\n", target_node->name);
|
38
|
+
} else {
|
39
|
+
int cmp = strcmp(target_node->name, add_node->name);
|
40
|
+
if(cmp == 0) {
|
41
|
+
printf("同姓同名の人が居ます。\n");
|
42
|
+
} else {
|
43
|
+
Node **p = cmp > 0 ? &target_node->left : &target_node->right;
|
44
|
+
*p = addData(*p, add_node);
|
45
|
+
}
|
46
|
+
}
|
47
|
+
return target_node;
|
48
|
+
}
|
49
|
+
|
50
|
+
void printTree(Node *node, int indent) {
|
51
|
+
if(node == NULL) {
|
52
|
+
for(int i=0; i<indent; i++) printf(" ");
|
53
|
+
if(indent > 0) printf("+");
|
54
|
+
printf("(null)\n");
|
55
|
+
} else {
|
56
|
+
printTree(node->left, indent + 2);
|
57
|
+
for(int i=0; i<indent; i++) printf(" ");
|
58
|
+
if(indent > 0) printf("+");
|
59
|
+
printf("%s\n", node->name);
|
60
|
+
printTree(node->right, indent + 2);
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
64
|
+
void freeTree(Node *node) {
|
65
|
+
if(node == NULL) return;
|
66
|
+
freeTree(node->left);
|
67
|
+
freeTree(node->right);
|
68
|
+
free(node);
|
69
|
+
}
|
70
|
+
|
71
|
+
Node *inputData(Node *root) {
|
72
|
+
Node w = {0};
|
73
|
+
printf("名前を入力してください。\n");
|
74
|
+
scanf("%s", w.name);
|
75
|
+
printf("電話番号を入力してください。\n");
|
76
|
+
scanf("%s\n", w.cellnumb);
|
77
|
+
return addData(root, &w);
|
78
|
+
}
|
79
|
+
|
80
|
+
int confirm() {
|
81
|
+
int answer;
|
82
|
+
printf("ノードを追加しますか?\n[Yes] ==> 1 [No] ==> 0\n");
|
83
|
+
scanf("%d", &answer);
|
84
|
+
return answer == 1;
|
85
|
+
}
|
86
|
+
|
87
|
+
int main(void) {
|
88
|
+
Node *root = NULL;
|
89
|
+
while(confirm()) root = inputData(root);
|
90
|
+
printTree(root, 0);
|
91
|
+
freeTree(root);
|
92
|
+
return 0;
|
93
|
+
}
|
94
|
+
```
|
6
句読点
test
CHANGED
@@ -12,4 +12,4 @@
|
|
12
12
|
root → target_node で
|
13
13
|
n = strcmp(target_node->name, add_node->name) を行おうとすれば、 target_node->name はアクセスできません。
|
14
14
|
|
15
|
-
ついでに、 main の do-while ループの条件に使っている answer と、追加するかの入力で使っている answer はスコープが違う別変数です。
|
15
|
+
ついでに、 main の do-while ループの条件に使っている answer と、追加するかの入力で使っている answer は、スコープが違う別変数です。
|
5
修正
test
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
printf("電話番号を入力してください。\n"); scanf("%s", p->cellnumb);
|
7
7
|
p->left = NULL;
|
8
8
|
p->right = NULL;
|
9
|
-
は、何処にアクセス
|
9
|
+
の各 p-> ~ は、何処にアクセスするか分かりません。
|
10
10
|
|
11
11
|
addData の最初の呼び出しは、 root は NULL です。
|
12
12
|
root → target_node で
|
4
追加
test
CHANGED
@@ -11,3 +11,5 @@
|
|
11
11
|
addData の最初の呼び出しは、 root は NULL です。
|
12
12
|
root → target_node で
|
13
13
|
n = strcmp(target_node->name, add_node->name) を行おうとすれば、 target_node->name はアクセスできません。
|
14
|
+
|
15
|
+
ついでに、 main の do-while ループの条件に使っている answer と、追加するかの入力で使っている answer はスコープが違う別変数です。
|
3
追加
test
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
teratail はデバッグしてもらう所ではありません。
|
2
2
|
最初から、各変数の値がどう変化しながら動作していくのかをしっかり意識して追って見てください。
|
3
3
|
|
4
|
-
入力
|
4
|
+
入力時、 p は不定です。
|
5
|
+
printf("名前を入力してください。\n"); scanf("%s", p->name);
|
6
|
+
printf("電話番号を入力してください。\n"); scanf("%s", p->cellnumb);
|
5
7
|
p->left = NULL;
|
6
8
|
p->right = NULL;
|
7
9
|
は、何処にアクセスさするか分かりません。
|
2
追加
test
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
teratail はデバッグしてもらう所ではありません。
|
2
2
|
最初から、各変数の値がどう変化しながら動作していくのかをしっかり意識して追って見てください。
|
3
|
+
|
4
|
+
入力直後、 p は不定です。
|
5
|
+
p->left = NULL;
|
6
|
+
p->right = NULL;
|
7
|
+
は、何処にアクセスさするか分かりません。
|
8
|
+
|
3
9
|
addData の最初の呼び出しは、 root は NULL です。
|
4
10
|
root → target_node で
|
5
11
|
n = strcmp(target_node->name, add_node->name) を行おうとすれば、 target_node->name はアクセスできません。
|
1
誤変換
test
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
teratail はデバッグしてもらう所ではありません。
|
2
2
|
最初から、各変数の値がどう変化しながら動作していくのかをしっかり意識して追って見てください。
|
3
3
|
addData の最初の呼び出しは、 root は NULL です。
|
4
|
-
root
|
4
|
+
root → target_node で
|
5
5
|
n = strcmp(target_node->name, add_node->name) を行おうとすれば、 target_node->name はアクセスできません。
|