以下のようなコードを作ったのですが、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;
}