lab5をポインタで実装できるのか??
右左を0、1に置き換えるを二進数と同じになるのは使えると思う。
void two(int i);
int main(){
int a=14;
two(a);
}
void two(int i){
if(i==0) return;
two(i/2);
if(i%2!=0) {
i-=1;
printf("1");
}
else printf("0");
}
上は十進数を二進数に変えるプログラムのつもりです。これのif(){}の中に
p=p->left、else の後にp=p->rightを入れればOKっぽい気がする
|
番号
|
深さ
|
流れ
|
|
1
|
0
|
なし
|
|
2
|
1
|
右
|
|
3
|
1
|
左
|
|
4
|
2
|
右→右
|
|
5
|
2
|
右→左
|
|
6
|
2
|
左→右
|
|
7
|
2
|
左→左
|
|
8
|
3
|
右→右→右
|
|
9
|
3
|
右→右→左
|
|
10
|
3
|
右→左→右
|
|
11
|
3
|
右→左→左
|
|
12
|
3
|
左→右→右
|
|
13
|
3
|
左→右→左
|
|
14
|
3
|
左→左→右
|
|
15
|
3
|
左→左→左
|
上の表は、②分岐の関係を見やすく(?)したもの。ここからいろんな関係を
見つけ出してプログラムに利用すべし
-
右を0左を1とすると二進数の順に右左がならんでいる
-
流れる回数(右→右なら2回)はその始まりの回数と一致する。
-
-例えば3回の流れは8から始まり、3回の流れは8回ある。
-
新しい深さに移動するのは”2の深さ乗”のときである
-
(教科書より)左の子は2*i+1:右の子は2*i+2逆に親は(i-1)/2となる
ポインタが二つのやつについて
前回のやつでvoid preorder(int a,struct cell **S)みたいな感じな
ポインタが二つついたのがありました。それについての自分の考察
まずこのプログラム
#include<stdio.h>
void tasu(int a){
a+=1;
}
int main(){
int a=0;
tasu(a);
printf("%d",a);
}
これの実行結果は0です。returnが無いので、メインのaにa+=1は反映されません。
次にこのプログラム
#include<stdio.h>
void tasu(int *a){
*a+=1;
}
int main(){
int a=0;
tasu(&a);
printf("%d",a);
}
これの実行結果は1です。これは、アドレスで計算するとmainでも数字反映される
という決まりがあるためです。
これらのことを参考に考えると*Sの値を関数内で変えたときメインでもその
変化を反映させるために**Sという形になったと考えられます
最終更新:2007年06月26日 23:07