質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1448閲覧

構造体または共用体ではない何かのメンバ ‘xxx’ の要求ですというコンパイルエラーの原因と解決法

KotatsuNeko

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2023/02/22 12:22

編集2023/02/22 14:00

実現したいこと

2文探索木を用いた電話帳検索システムの二分探索木にデータを挿入する関数を作成したいです。

前提

キーボードでデータを入力して二分探索木にデータを挿入する関数を作成したいのですが、キーボードから文字列を読み取って構造体のメンバに格納するという意図で書いた部分の以下のコンパイルエラーの原因と解決方法が分かりません。

発生している問題・エラーメッセージ

エラー: 構造体または共用体ではない何かのメンバ ‘name’ の要求です printf("名前を入力してください。\n"); scanf("%s", p.name); エラー: 構造体または共用体ではない何かのメンバ ‘cellnumb’ の要求です printf("電話番号を入力してください。\n"); scanf("%s", p.cellnumb);

該当のソースコード

c言語

1#include <stdio.h> 2#include <string.h> 3#include <stdlib.h> 4#define NUMBER 64 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 } 24 else if(n > 0){ 25 target_node->left = addData(target_node->left, add_node); 26 } 27 else if(n < 0){ 28 target_node->right = addData(target_node->right, add_node); 29 } 30 31} 32 33int main(void) 34{ 35 int answer; 36 Node *root; 37 Node *p; 38 char a,b; 39 40 root = NULL; 41 do{ 42 int answer; 43 printf("ノードを追加しますか?\n[Yes] ==> 1 [No] ==> 0"); scanf("%d",&answer); 44 if(answer == 1){ 45 printf("名前を入力してください。\n"); scanf("%s", p.name); 46 printf("電話番号を入力してください。\n"); scanf("%s", p.cellnumb); 47 p->left = NULL; 48 p->right = NULL; 49 root = addData(root, p); 50 } 51 }while(answer == 1); 52 53 return 0; 54} 55

###修正版ソースコード

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 int n; 17 n = strcmp(target_node->name, add_node->name); 18 if(target_node == NULL){ 19 Node *target_node = malloc(sizeof(Node)); 20 strcpy(target_node->name, add_node->name); 21 strcpy(target_node->cellnumb, add_node->cellnumb); 22 target_node->left = NULL; 23 target_node->right = NULL; 24 printf("%s", target_node->name); 25 } 26 else if(n > 0){ 27 target_node->left = addData(target_node->left, add_node); 28 } 29 else if(n < 0){ 30 target_node->right = addData(target_node->right, add_node); 31 } 32 else if(n = 0) 33 printf("同姓同名の人が居ます。\n"); 34 return target_node; 35} 36 37 38int main(void) 39{ 40 int answer; 41 Node *root; 42 Node *p; 43 44 root = NULL; 45 do{ 46 int answer; 47 printf("ノードを追加しますか?\n[Yes] ==> 1 [No] ==> 0\n"); scanf("%d",&answer); 48 if(answer == 1){ 49 printf("名前を入力してください。\n"); scanf("%s", p->name); 50 printf("電話番号を入力してください。\n"); scanf("%s", p->cellnumb); 51 p->left = NULL; 52 p->right = NULL; 53 root = addData(root, p); 54 } 55 }while(answer == 1); 56 57 return 0; 58} 59

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

scanf("%s", p.name);
scanf("%s", p.cellnumb);

その後に、

p->left = NULL;
p->right = NULL;

と、ちゃんと書いてるのに何故?
scanf("%s", p->name);
scanf("%s", p->cellnumb);
ですね。

あと、ロジックまでは見てませんが、形式的な誤りとしては、

Node *addData(Node *target_node, Node *add_node)

と、関数addDataは、Nodeへのポインターを返すと宣言して、実際に返り値をポインター変数に代入していますが、実際には値を返すコードがありません。

また、nが0の時の考慮が無いようです。

投稿2023/02/22 12:52

otn

総合スコア84533

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KotatsuNeko

2023/02/22 14:11 編集

返信ありがとうございます。n=0の場合にも対応できるよう修正しました。
guest

0

ベストアンサー

Node *p;

p.name ではなく、p->name ですね

投稿2023/02/22 12:26

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KotatsuNeko

2023/02/22 12:44

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問