新入社員応援企画(その4)
《問題》
任意の型value1およびvalue2を入れ替える関数swap()を作成しなさい。
(続きを読む…)
《問題》
以下の構造体PERSON型変数value1およびvalue2を入れ替える関数stswap()を作成しなさい。
typedef struct person {
int id;
char name[50];
} PERSON;
《問題》
文字列型変数value1およびvalue2の中身を入れ替える関数sswap()を作成しなさい。ただし、strcpy()、memcpy()などは使用しないこと。
(続きを読む…)
関数ポインタって、引数として変数ではなく関数を渡すもの。百聞は一見にしかずということで、前回使ったキュー&スタックに検索用の関数を追加する。
《que.h(追加分)》
int que_search(
const void *target, void **data,
int (*search)(const void *src, const void *dst)
);
プロトタイプ宣言にque_search()を追加する。関数ポインタとしてsearch()を受取る。search()には、比較元のデータであるsrcと比較対象のデータであるdstが必要。
《que.c(追加分)》
int que_search(const void *target, void **data, int (*search)(const void *src, const void *dst))
{
QUE *p = NULL;
int status;
p = root.next;
for(;;) {
if (p == &root) {
return(1);
}
status = search(target, p->data);
if (status == 0) {
*data = p->data;
free(p);
return(0);
} else {
p = p->next;
}
}
return (0);
}
変数targetと、QUEの中に格納されているdataの値を関数ポインタのsearch()に渡して、その結果が0である場合に、一致したとしてQUEの中にあるdataを返す。
ここで、重要なのがsearch()には、上にも書いた二つの引数以外に、戻り値としてsrcとdstが一致した場合には0、不一致の場合には0以外を返す必要がある。
《main.c》
#include "que.h"
int main(int argc, char **argv)
{
int status;
char *str = NULL;
char *src = NULL;
status = que_enque("fuga");
status = que_enque("hoge");
status = que_enque("geho");
status = que_enque("one");
status = que_enque("two");
status = que_enque("three");
src = strdup("fuga");
status = que_search (src, (void **)&str, datacmp);
if (status) {
fprintf(stderr, "%s is not found.\n", src);
} else {
puts(str);
}
exit(0);
}
int datacmp(const void *src, const void *dst)
{
int status;
status = strcmp(src, dst);
return (status);
}
データ比較用関数として、datacmp()を作成。見たとおり内部でstrcmp()を呼んでいるだけなので、特に関数を作る必要はない。ただ、これを応用することによって、文字列以外のデータについても検索することができるようになる。