チェイン法を使ったハッシュのプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
クォーク
記事: 4
登録日時: 9年前

チェイン法を使ったハッシュのプログラム

#1

投稿記事 by クォーク » 9年前

チェイン法を使ったハッシュのプログラムについて質問があります。

以下のようなコードを作ったのですが、70行目にあるかと思われる
「 p->key = a;」
というところで、【assignment to expression with array type】というエラーが出てコンパイルが通りません…

解決方法わかる人いれば教えてくれませんか・・・?


コード:

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

#define BUCKET_SIZE 50 /*ハッシュ表の大きさ*/


typedef  struct cell{
	    char key[20];
		int data;
		struct cell *next;
    }CELL;
CELL *table[BUCKET_SIZE];

/*ハッシュ関数。ハッシュ値を求める*/
int hash(char* key)
{
	int i=0;
	while(*key){
		i += *key++;
	}
	return i % 100;
}

/*キーが等しければ1を、等しくなければ0を返す*/
int keyequal(char* key1, char* key2){
	if(strcmp(key1,key2)==0)return 1;
	else return 0;
}

void init_chaining()
{ 
	int i;  
	for(i=0; i<BUCKET_SIZE; i++)
	  table[i] = NULL;
}

int find_chaining(char* key)
{
	CELL *p;
	for(p != NULL;p=p->next;)
	{
		if(strcmp(p->key,key)==0){
			return 1;
		}
	}
	return 0;
}

/*insert ハッシュ表にデータを挿入する*/
/*登録に成功したら1を返す*/
/*登録に失敗(すでに同じキーをもつデータがある)*/
/*したら0を返す*/
int insert_chaining(char* key, int data){
	CELL *p;
	char *a;
	int h;
	int L = strlen(key);

	if(find_chaining(key) != 0){
		return 0;
	}

	p = malloc(sizeof(CELL));
	a = malloc(L+1);
	strcpy(a,key);
	
	h = hash(key);
	p->data = data;
	p->key = a;
	p->next = table[h];
	
	return 1;
	//登録に成功したら1を返す
}

int delete_chaining(char* key)
{ int h;
	CELL *p, *q;
	h=hash(key);

	if(find_chaining == 0){
		return 0;
	}
   /*リストの先頭のセルが削除すべきデータか*/
	if(keyqual(table[h]->key,key)){
		p = table[h];
		table[h] = table[h]->next;
		free(p);
		p = NULL;
		
		return 1;
	}
	/*リストの2番目以降のセルについて順番にチェックする*/
	for(q = table[h],p = table[h]->next;
	p != NULL;
	q = p, p = p->next){
		if(keyequal(p->key,key)){
			q->next = p->next;
			free(p);
			p = NULL;
			return 1;
		}
	}
	return 0;
}

int main(void){
	char key[20] ;
	int data;
	int find_data;
	char command;

	init_chaining();

	do{
		printf("コマンドを入力してください。\n");
		printf("データ格納:i\n");
		printf("データ削除:d\n");
		printf("データ探索:f\n");
		printf("終了:q\n");
		scanf( "%c", &command );
		fflush(stdin);

	switch( command ){
		case 'i':
			printf( "キーを入力して下さい" );
			scanf( "%s", &key );
			fflush(stdin);
			printf( "データを入力して下さい" );
			scanf( "%d", &data );
			fflush(stdin);
			insert_chaining(key, data);
			break;
		case 'd':
			printf( "キーを入力して下さい" );
			scanf( "%s", &key );
			fflush(stdin);
			if(delete_chaining(key)){
				printf( "キー%sに対応するデータを削除しました\n",  key );
			}
			else{
				printf( "キー%sに対応するデータはありません\n", key );
			}

		case 'f':
			printf( "キーを入力して下さい" );
			scanf( "%s", &key );
			fflush(stdin);
		   find_data = find_chaining( key );
			if( find_data != 0 ){
				printf( "キー%sに対応するのは%d\n", key, find_data );
			}
			else{
				printf( "キー%sに対応するデータはありません\n", key );
			}
			break;

		case 'q':
			break;

		default:
			printf("コマンドが正しくありません。入力しなおしてください。\n");
			break;
		}
	}while(command !='q');

return 0;
}

mikko

Re: チェイン法を使ったハッシュのプログラム

#2

投稿記事 by mikko » 9年前

構造体 cell のメンバ char key[20] に直接ポインタを代入しようとしています。
この箇所に関しては strcpy( p->key, key ); が意図するコードのような気がします。

box
記事: 2002
登録日時: 14年前

Re: チェイン法を使ったハッシュのプログラム

#3

投稿記事 by box » 9年前

クォーク さんが書きました:

コード:

	p->key = a;
おそらく、

コード:

        strcpy(p->key, a);
とすれば、少なくともコンパイルは通ると思います。
ただし、思ったとおりに動くかどうかはわかりません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: チェイン法を使ったハッシュのプログラム

#4

投稿記事 by みけCAT » 9年前

コード:

scanf( "%s", &key ); /* 渡すデータの型と変換指定子の対応がおかしい */
fflush(stdin); /* output streamでもupdate streamでもないものへのポインタをfflushに渡している */
これらのコードは未定義動作を起こします。使用はやめるべきでしょう。

また、tableの添字は0~49しか使えないのに、hash関数は負の数や最大99までの正の数を返す可能性があり、
その戻り値をノーチェックでtableの添字として使っているため、範囲外を参照して未定義動作を起こすリスクもあります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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