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

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

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

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

3回答

735閲覧

ポインタについてわからないところがでたのでアドバイスをお願いします。

GAKU_SAY

総合スコア23

C

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

Null

Nullとは、プログラミング言語やデータベースにおけるデータ表現の一種です。コンテキストによって"空"もしくは"長さ0の文字列"、”未知・不明”を意味します。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

1クリップ

投稿2020/07/16 00:59

編集2020/07/16 01:04

構造体とポインタについての質問です。関数の定義は変えないでmain関数のポインタを弄りたいです。

###条件
関数の定義は変えないでください

c

1struct node { 2 int key; 3 struct node *parent, *left, *right; 4}; 5 6struct node *new_node(int key) { 7 struct node *p; 8 9 p = (struct node*)malloc(sizeof(struct node)); 10 11 p->key = key; 12 13 p->left = NULL; 14 p->right = NULL; 15 p->parent = NULL; 16 17 return p; 18} 19 20int insert(int key, struct node *root){ 21 22 while(root != NULL){ 23 24 if (key > root->key) { 25 root = root->right; 26 }else if (key < root->key) { 27 root = root->left; 28 }else{ 29 return 0; 30 } 31 32 } 33 root = new_node(key); 34 35 return 1; 36} 37 38int main(){ 39 40 struct node *root = NULL; 41 int key = 0; 42 43 printf("ask:"); 44 scanf("%d",&key); 45 46 insert(key, root); 47 ////////////ここでデバッグしたら/////////////// 48 free(root); 49 50 return 0; 51} 52

デバッグの結果
root = NULL

###考察
関数の変数にnew_nodeをしているだけ

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

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

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

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

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

maisumakun

2020/07/16 01:18 編集

本当に関数の「定義」を変えてはいけないのでしょうか?(それでは「関数全体を書き換えてはいけない」ということと等しいので、何もできません)
guest

回答3

0

insert(key, root);

これではrootのナカミが関数に渡るだけで、rootは変わりようがありません
rootを変更するなら、rootのアドレスを渡しましょう

#当然insertの方もそれに合わせて修正の必要あり

投稿2020/07/16 01:04

編集2020/07/16 01:05
y_waiwai

総合スコア88042

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

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

GAKU_SAY

2020/07/16 01:17

そう思っているのですが、仕様をint insert(int key, struct node* root)と言われてましてどうしたらいいのかわからないんです。
y_waiwai

2020/07/16 01:23

そこ、insertじゃなくて、 root=new_node(key); じゃないんですか?
guest

0

ベストアンサー

関数の定義というと関数の本体のことですが、
変えてはいけないのは、関数の仕様、すなわち引数と返却値のことではありませんか?

そうであれば struct node は parent を持っているので、
int insert(int key, struct node *root); のままで二分木を構成することはできます。

C

1#include <stdio.h> // printf 2#include <stdlib.h> // malloc, free 3 4struct node { 5 int key; 6 struct node *parent, *left, *right; 7}; 8 9struct node *new_node(int key) 10{ 11 struct node *p = (struct node*)malloc(sizeof(struct node)); 12 p->key = key; 13 p->parent = p->left = p->right = NULL; 14 return p; 15} 16 17int insert(int key, struct node *root) 18{ 19 if (key > root->key) { 20 if (root->right) return insert(key, root->right); 21 struct node *p = new_node(key); 22 p->parent = root; 23 root->right = p; 24 return 1; 25 } 26 if (key < root->key) { 27 if (root->left) return insert(key, root->left); 28 struct node *p = new_node(key); 29 p->parent = root; 30 root->left = p; 31 return 1; 32 } 33 return 0; 34} 35 36void print(struct node *p) 37{ 38 if (p) print(p->left), printf("%d\n", p->key), print(p->right); 39} 40 41void freeAll(struct node *p) 42{ 43 if (p) freeAll(p->left), freeAll(p->right), free(p); 44} 45 46int main(void) 47{ 48 struct node dummy = { -2147483648 }; 49 struct node *root = &dummy; 50 int key[6] = { 5, 3, 1, 4, 2, 6 }; 51 52 for (int i = 0; i < 6; i++) insert(key[i], root); 53 print(root->right); 54 freeAll(root->right); 55}

投稿2020/07/16 03:04

kazuma-s

総合スコア8224

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

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

episteme

2020/07/16 03:44

「空要素をrootに置いちゃダメ」縛りがあるとツラいもんがありますね...
guest

0

C

1void increment(int count) { 2 count = count + 1; 3} 4 5int main() { 6 int count = 123; 7 increment(count); 8 // さてここでcountはいくつになるかな? 9 // 124? 違うよね、123のままだよね。 10 // それと同じこと。 11 return 0; 12}

投稿2020/07/16 01:02

episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問