実現したいこと
二分探索木を用いた電話帳検索システムのデータの挿入を行う関数を作成したい。
前提
キーボードから名前と電話番号を入力して二分探索木を構築するプログラムを作成したのですが、実行すると最初の名前と電話番号の入力を行った後にSegmentation fault (コアダンプ)表示されてしまいます。原因と解決方法を教えてください。
発生している問題・エラーメッセージ
ノードを追加しますか? [Yes] ==> 1 [No] ==> 0 1 名前を入力してください。 souseki_natsume 電話番号を入力してください。 019-887-8765 Segmentation fault (コアダンプ)
該当のソースコード
c言語
1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#define NUMBER 10000 5 6typedef struct node{ 7 char name[NUMBER]; 8 char cellnumb[NUMBER]; 9 struct node *left; 10 struct node *right; 11}Node; 12 13Node *addData(Node *target_node, Node *add_node) 14{ 15 int n; 16 n = strcmp(target_node->name, add_node->name); 17 if(target_node == NULL){ 18 Node *target_node = malloc(sizeof(Node)); 19 strcpy(target_node->name, add_node->name); 20 strcpy(target_node->cellnumb, add_node->cellnumb); 21 target_node->left = NULL; 22 target_node->right = NULL; 23 printf("%s", target_node->name); 24 } 25 else if(n > 0){ 26 target_node->left = addData(target_node->left, add_node); 27 } 28 else if(n < 0){ 29 target_node->right = addData(target_node->right, add_node); 30 } 31 else if(n = 0) 32 printf("同姓同名の人が居ます。\n"); 33 return target_node; 34} 35 36 37int main(void) 38{ 39 int answer; 40 Node *root; 41 Node *p; 42 43 root = NULL; 44 do{ 45 int answer; 46 printf("ノードを追加しますか?\n[Yes] ==> 1 [No] ==> 0\n"); scanf("%d",&answer); 47 if(answer == 1){ 48 printf("名前を入力してください。\n"); scanf("%s", p->name); 49 printf("電話番号を入力してください。\n"); scanf("%s", p->cellnumb); 50 p->left = NULL; 51 p->right = NULL; 52 root = addData(root, p); 53 } 54 }while(answer == 1); 55 56 return 0; 57}
修正後のソースコード
c言語
1 2#include <stdio.h> 3#include <string.h> 4#include <stdlib.h> 5#define NUMBER 10000 6 7typedef struct node{ 8 char name[NUMBER]; 9 char cellnumb[NUMBER]; 10 struct node *left; 11 struct node *right; 12}Node; 13 14Node *addData(Node *target_node, Node *add_node) 15{ 16 if(target_node == NULL){ 17 target_node =(Node*)malloc(sizeof(Node)); 18 strcpy(target_node->name, add_node->name); 19 strcpy(target_node->cellnumb, add_node->cellnumb); 20 target_node->left = NULL; 21 target_node->right = NULL; 22 printf("%s", target_node->name); 23 } 24 else if(strcmp(target_node->name, add_node->name) > 0){ 25 target_node->left = addData(target_node->left, add_node); 26 } 27 else if(strcmp(target_node->name, add_node->name) < 0){ 28 target_node->right = addData(target_node->right, add_node); 29 } 30 else 31 printf("同姓同名の人が居ます。\n"); 32 return target_node; 33} 34 35 36int main(void) 37{ 38 int answer; 39 Node *root; 40 Node *p; 41 42 root = NULL; 43 do{ 44 printf("ノードを追加しますか?\n[Yes] ==> 1 [No] ==> 0\n"); scanf("%d",&answer); 45 if(answer == 1){ 46 printf("名前を入力してください。\n"); scanf("%s", p->name); 47 printf("電話番号を入力してください。\n"); scanf("%s", p->cellnumb); 48 p->left = NULL; 49 p->right = NULL; 50 root = addData(root, p); 51 } 52 }while(answer == 1); 53 54 return 0; 55} 56
修正後(2)のソースコード
c言語
1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#define NUMBER 10000 5 6typedef struct node{ 7 char name[NUMBER]; 8 char cellnumb[NUMBER]; 9 struct node *left; 10 struct node *right; 11}Node; 12 13Node *addData(Node *add_node, Node *target_node) 14{ 15 if (target_node == NULL){ 16 target_node = malloc(sizeof(Node)); 17 memcpy(target_node, add_node, sizeof(Node)); 18 } 19 else{ 20 int cmp = strcmp(target_node->name, add_node->name); 21 if (cmp > 0) 22 target_node->left = addData(add_node, target_node->left); 23 else if (cmp < 0) 24 target_node->right = addData(add_node, target_node->right); 25 else 26 puts("同姓同名の人が居ます。"); 27 } 28 return target_node; 29} 30 31void showALLData(Node *node) 32{ 33 if(node != NULL){ 34 showALLData(node->left); 35 printf("name : %s cellnumber : %s\n", node->name, node->cellnumb); 36 showALLData(node->right); 37 } 38} 39 40 void freeTree(Node *node) { 41 if(node == NULL) return; 42 freeTree(node->left); 43 freeTree(node->right); 44 free(node); 45 } 46 47int main(void) 48{ 49 int answer; 50 Node *root = NULL; 51 52 do{ 53 printf("ノードを追加しますか?\n[Yes] ==> 1 [No] ==> 0\n"); scanf("%d",&answer); 54 if(answer == 1){ 55 Node p = {0}; 56 printf("名前を入力してください。\n"); scanf("%s", p.name); 57 printf("電話番号を入力してください。\n"); scanf("%s", p.cellnumb); 58 root = addData(&p, root); 59 } 60 showALLData(root); 61 }while(answer == 1); 62 63 freeTree(root); 64 65 return 0; 66} 67
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/02/23 01:33
2023/02/23 07:23 編集
2023/02/24 04:59 編集