Sortingのための準備(C言語編)

まずはC言語で.標準入力から可変個のデータを読み込む関数と,それを出力する関数を作ってみた.mylib.cとして保存しておく.

#include "mylib.h"

/** 
 * @brief 配列にデータを標準入力から読み込む
 * 
 * @param size 配列の大きさ
 * 
 * @return 配列
 */
int *load_array(int *size){
	char line[BUFSIZ];
	char *token;
	char *str;
	int allocated=1;
	int *array=(int *)calloc(allocated,sizeof(int));

	*size=0;

	// EOFがくるまで繰り返し
	while(fgets(line,BUFSIZ,stdin)!=NULL){
		// 入力された文字列をトークンに分割
		for(str=line;(token=strtok(str," \n"))!=NULL;str=NULL){
			// メモリが足りなければ追加
			if(*size >= allocated){
				allocated*=2;
				array=(int *)realloc(array,allocated*sizeof(int));
			}
			// 文字列を数値に変換して配列へ格納
			array[*size]=atoi(token);
			(*size)++;
		}
	}

	// 配列の長さを調整
	array=(int *)realloc(array,(*size)*sizeof(int));

	return array;
}

/** 
 * @brief 配列の内容を1行につき10個ずつ表示する
 * 
 * @param array 配列
 * @param size 配列の大きさ
 */
void print_array(int *array,int size){
	int i;
	for(i=0;i<size;i++){
		printf("%8d",array[i]);
		if(i%10==9)printf("\n");
	}
}

メモリ確保を賢くやってみました.確保しすぎた分を最後に微調整してぴったりにしています.
mylib.hはプロトタイプ宣言とヘッダのインクルード.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int *load_array(int *size);
void print_array(int *array,int size);

とりあえず,使い方の例は,

#include "mylib.h"

int main(){
	int *array;
	int size;

	//入力
	array=load_array(&size);

	//ここでソート
	//bubblesort(array,size);
	//
	
	//出力
	print_array(array,size);

	free(array);

	return 0;
}

こんなプログラム(test.c)を作って,一緒にコンパイルする.
Linuxなら

$ gcc -o test test.c mylib.c
$ ./test.c < data.txt

data.txtは,データが各行,適当な個数ごとにスペース区切りで書かれているものとする.

64 70 12
34 35
74 24 81
86 89
54 76 66 92 41 93 95 97 3 49 56
73 78 90 96 98
69
57 44 36 9 20 55
31 53 79 94
99 11
87 5 15
59 17 46 52 62
75 77 38 27 88
23
91 32 19 16 8 25 30 58 72 43 42 29 48 50 60 71
40 65 47
10 13 80 82
83
14
51 2 84 39 45 0
68
85 61 1
26
21 18 22 6 33
37
28 63 4 67
7

さて,ソーティング部分を作るか・・・.