=============================================================================== 2002 年 07 月 03 日(水) 2002 年度「応用数理C3」「計算数学1」 岩瀬順一 =============================================================================== == 020703a.c == /* 020529c.c の改造 */ #include #include #include #include #define N 23 /* ソートするものの個数 */ #define MAX 15 /* 数値データは 0 ... MAX */ struct data { int num; /* 通し番号 */ int val; /* この値でソート */ }; typedef struct data Data; #define swap(I,J) { Data tmp = a[(I)]; a[(I)] = a[(J)]; a[(J)] = tmp; } int myrand(int max); void print(void); void sort(void); Data a[N]; main() { int i; srand((unsigned)time(NULL)); /* 現在時刻で乱数の種を初期化 */ for (i=0; i0; m--) { for (i=0; i a[i+1].val) { swap(i, i+1); print(); /* swap() を呼ぶごとに印字する */ } } } } == 020703a.c == /* 020515a.c の改造 */ #include #include #include #define OK 1 #define YES 1 #define NO 0 struct data { /* Data 型を定義 */ char *string; /* 文字列データ */ int number; /* 数値データ */ struct data *next; /* 次へのポインタ */ }; typedef struct data Data; /* struct data を Data と呼ぶ */ #define HASHSIZE 7 /* hash の大きさ、実際はもっと大きくとる */ #define BUFSIZE 1024 /* バッファの大きさ */ void Data_add(Data *p, int i); Data *Data_construct(FILE *in); void Data_printlist(Data *head); void Data_print(Data *p); int hash(Data *p); Data head[HASHSIZE]; /* 先頭(ダミー)の列 */ int main(int argc, char *argv[]) { int i; FILE *in; Data *p; if (argc != 2) { fprintf(stderr, "引数の数が違います.\n"); return 1; } in = fopen(argv[1], "rt"); if (in == NULL) { fprintf(stderr, "ファイル \"%s\" を開けません.\n", argv[1]); return 1; } for (i=0; inext = head[i].next; head[i].next = p; } /* in から一行を読み込んで Data 型オブジェクトを作り、そのアドレスを返す */ Data *Data_construct(FILE *in) { /* 前と同じにつき省略 */ } /* ダミーのヘッド head から始まるリストを印字 */ void Data_printlist(Data *head) { Data *p; for (p = head->next; p != NULL; p = p->next) { Data_print(p); } } /* Data 型オブジェクト *p を印字 */ void Data_print(Data *p) { printf("\t%s\t%d\n", p->string, p->number); } /* hash 関数(一例)*/ int hash(Data *p) { const int c = 5; int val = 0; int i; for (i=0; p->string[i] != '\0'; i++) { val = (val * c + p->string[i]) % HASHSIZE; } return val; }