2009-07-08から1日間の記事一覧

正しいポインタの操作

C K&R

K&R本 5.4箇条書きでまとめてみる 同じ型のポインタの代入 ポインタと整数との加算、減算 同じ配列のメンバーに対する二つのポインタの引算と比較 ゼロの代入やゼロとの比較 (void *)の代入 これらがすなわち正しいポインタの操作方法となる。これ以外の操作…

0とNULLの関係

C K&R

K&R本 5.4 Cでは、データを正しく指すポインタは0にならないことを保証しているから、0という戻り値は、異常事態の発生を知らせるのに使うことが出来る。ポインタと整数は相互交換可能ではない。ゼロは唯一の例外である。定数ゼロはポインタへ代入してよく、…

二分探索木

C

http://www.geocities.jp/ky_webid/algorithm/017.html前回の二分木構造の続きですね。 構造は二分木と同じだが、「左の子 ≤ 親 ≤ 右の子」という制約を持つ。左の子と右の子の両方に等号をつけているが、実際にはどちらかに統一しておく必要がある。平衡(…

ポインタ変数を引数にした間接参照がエラーになるケース

C

色々と本やWebでポインタ関連の資料を読んではいるのですが、良く分からない挙動がありました。 int main (void) { int *num; num = (int *)malloc(sizeof(int)); *num = 10; printf("%d",*num); return 0; } これはポインタ変数numにmallocでメモリを割り当…

二分木構造

http://www.geocities.jp/ky_webid/algorithm/016.htmlいわゆるツリー構造と呼ばれる物です。概念としては良く分かりました。が、実際にどう実装するかのイメージがつきません。ということで今回は先に解答例をじっくり読んでどういったものかを理解した上で…

itoa関数の再帰版の再実装、負の値に対応

C

itoa関数の再帰版の実装 - (void*)Pないとこれですが、負の値のことをすっかり忘れてました。ということで再実装しました。 #include <stdio.h> void myitoa (int n,char *s) { if(n){ int i = 0; int l = n; while(l/=10){ i++; } myitoa(n/10,s); if(n<0){ n *= -1;</stdio.h>…

オープンアドレス法によるハッシュ探索

http://www.geocities.jp/ky_webid/algorithm/015.html前回に引き続き、ハッシュ探索のお話です。今回はオープンアドレス法という処理方法になります。チェイン法と違って、同じ格納位置が生成されたときに元のハッシュテーブルを拡張し、データの重複を防ぎ…

参照渡しで値が全部同じになるミスをした

C

やってしまいました。単純化したコードですが、下記のようなことをしてしまいました。 int main (void) { int *num[10]; int i; for(i=0;i<10;++i){ int data = i; num[i] = &data; } for(i=0;i<10;++i){ printf("%d ",*num[i]); } return 0; } $ main 9 9 9…

逆ポーランド式を計算するプログラム

C K&R

K&R本 演習5-10 コマンド行からの逆ポーランド式を計算するプログラムexprを書け。各演算子あるいは被演算数は引数として分離されているものとする。例えば expr 2 3 4 + *なら2×(3+4)を計算するようにせよ。 これはかなりプログラムらしい演習ですね。やっ…

strncpy、strncat、strncmpを自作する

C K&R

K&R本 演習5-5 その引数である文字列の最初の最大 n 文字を扱うライブラリ関数strncpy、strncat、strncmpを書け。例えば、strncpy(s,t,n)はtの最大n文字をsにコピーするものにせよ。 まずはstrncpy関数 #include <stdio.h> char *mystrncpy(char *s,char *t,int n) { </stdio.h>…

文字列の終りと比較するstrend関数

C K&R

K&R本 演習5-4 文字列tが文字列sの終りにあるときには1を、そうでないときにはゼロを返す関数strend(s,t)を書け。 #include <stdio.h> #include <string.h> int strend(char *s,char *t) { size_t slen = strlen(s); size_t tlen = strlen(t); if ( slen < tlen ) { return 0; }</string.h></stdio.h>…