ハッシュ,チェイン法について。
Posted: 2012年12月25日(火) 23:21
タイトルの通り、ハッシュ法のチェイン法を実現するプログラムについて質問です。
内容は「配列にチェイン法を用いて整数を格納せよ。入力毎に入力された配列の中身を出力すること。終了条件は0以下の入力があった時とし、エラー処理は不要とする。」です。
配列数は"10"、ハッシュ値は"入力%10"です。
このソースを実行すると「チェック0」の出力のみ行われて強制終了します。
ポインタの渡し方が悪いのでしょうか?
ご指摘よろしくお願いします。
内容は「配列にチェイン法を用いて整数を格納せよ。入力毎に入力された配列の中身を出力すること。終了条件は0以下の入力があった時とし、エラー処理は不要とする。」です。
配列数は"10"、ハッシュ値は"入力%10"です。
#include<stdio.h>
#include<stdlib.h>
typedef struct chain_
{
int data;
struct chain_ *next;
}
chain;
/*ハッシュ値を求める関数*/
int hash(int x,int hash)
{
return x%hash;
}
/*チェイン法の関数*/
void add(chain *place,int x)
{
chain *save;
save = place;
printf("チェック0\n");
while(save->next != NULL)
{
save = save->next;
printf("チェック1\n");
}
printf("チェック2\n");
save->next = (chain*)malloc(sizeof(chain));
save->data = x;
}
/*出力する関数*/
void output(chain *place)
{
printf(" → %d",place->data);
if(place->next != NULL)
{
output(place->next);
}
}
/*メイン*/
int main()
{
int x,h; //入力,ハッシュ値
chain *data[10]; //配列
/*入力*/
printf("入力:");
while(scanf("%d",&x), 0<x)
{
/*ハッシュ値を求める*/
h = hash(x,10);
/*チェイン法で格納*/
add(data[h],x);
/*出力*/
printf("data[%d]",h);
output(data[h]);
printf("\n");
/*次の入力*/
printf("入力:");
}
return 0;
}
ポインタの渡し方が悪いのでしょうか?
ご指摘よろしくお願いします。