回答編集履歴

7

コード追加

2023/02/23 10:29

投稿

jimbe
jimbe

スコア12632

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

句読点

2023/02/22 15:56

投稿

jimbe
jimbe

スコア12632

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

修正

2023/02/22 15:51

投稿

jimbe
jimbe

スコア12632

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

追加

2023/02/22 15:48

投稿

jimbe
jimbe

スコア12632

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

追加

2023/02/22 15:45

投稿

jimbe
jimbe

スコア12632

test CHANGED
@@ -1,7 +1,9 @@
1
1
  teratail はデバッグしてもらう所ではありません。
2
2
  最初から、各変数の値がどう変化しながら動作していくのかをしっかり意識して追って見てください。
3
3
 
4
- 入力直後、 p は不定です。
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

追加

2023/02/22 15:43

投稿

jimbe
jimbe

スコア12632

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

誤変換

2023/02/22 15:41

投稿

jimbe
jimbe

スコア12632

test CHANGED
@@ -1,5 +1,5 @@
1
1
  teratail はデバッグしてもらう所ではありません。
2
2
  最初から、各変数の値がどう変化しながら動作していくのかをしっかり意識して追って見てください。
3
3
  addData の最初の呼び出しは、 root は NULL です。
4
- rooter → target_node で
4
+ root → target_node で
5
5
  n = strcmp(target_node->name, add_node->name) を行おうとすれば、 target_node->name はアクセスできません。