ハッシュ,チェイン法について。

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
カーバンクル

ハッシュ,チェイン法について。

#1

投稿記事 by カーバンクル » 13年前

タイトルの通り、ハッシュ法のチェイン法を実現するプログラムについて質問です。

内容は「配列にチェイン法を用いて整数を格納せよ。入力毎に入力された配列の中身を出力すること。終了条件は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;
}
このソースを実行すると「チェック0」の出力のみ行われて強制終了します。
ポインタの渡し方が悪いのでしょうか?
ご指摘よろしくお願いします。

Poco
記事: 161
登録日時: 15年前

Re: ハッシュ,チェイン法について。

#2

投稿記事 by Poco » 13年前

save->nextでsaveが無効なポインタなため落ちています。
add()関数の引数placeには有効なポインタ(参照先に実体があるポインタ)を入れましょう。
56行目で宣言している配列dataには無効なポインタしか格納されていません。

カーバンクル

Re: ハッシュ,チェイン法について。

#3

投稿記事 by カーバンクル » 13年前

Poco さんが書きました:save->nextでsaveが無効なポインタなため落ちています。
add()関数の引数placeには有効なポインタ(参照先に実体があるポインタ)を入れましょう。
56行目で宣言している配列dataには無効なポインタしか格納されていません。
返信ありがとうございます。

ご指摘の点を踏まえて今の今まで考えてみたのですが、良いやり方にたどり着けずにこんな時間になってしまいました。

カーバンクル

Re: ハッシュ,チェイン法について。

#4

投稿記事 by カーバンクル » 13年前

自分の力不足で問題を解決することができませんでした。

大変失礼な話なのですが、お時間に余裕がある方、上記の内容でソースコードを組んで頂けないでしょうか。

私が組んだソースコードと全く違う処理になってしまっても構いません。よろしくお願いします。

かずま

Re: ハッシュ,チェイン法について。

#5

投稿記事 by かずま » 13年前

コード:

        +------+
data[0] | NULL |
        +------+     +-------------+
data[1] |  *-------->|    x : 21   |
        +------+     | next : NULL |
data[2] | NULL |     +-------------+
        +------+     +-------------+     +-------------+
data[3] |  *-------->|    x : 43   |     |    x : 13   |
        +------+     | next :  *-------->| next : NULL |
data[4] | NULL |     +-------------+     +-------------+
        +------+
            :
        +------+
data[9] | NULL |
        +------+
入力が 21, 43, 13 だった場合、結果のデータ構造がこのようになることを
期待していますか?
自分の書いたプログラムを main から順番に実行していくとどのようになるか
試してみてください。

閉鎖

“C言語何でも質問掲示板” へ戻る