#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct
{
char*english;
char*japanese;
}WORDSET;
typedef struct
{
WORDSET **data;
unsigned int size;
}HASHTABLE;
unsigned int MakeHash2(char*str,unsigned int hashmax)
{ unsigned int n,length,hash,weight;
length=strlen(str);
for(n=weight=hash=0;n<length;++n,++weight)
{ if(weight>7){
weight=0;
}
hash+=(int)str[n]<<(4*weight);
}
return hash%hashmax;
}
unsigned int ReHAsh(HASHTABLE *hashtable,unsigned int firsthash)
{
unsigned int hashval,k;
for(k=1;k<=hashtable->size/2;++k)
{
hashval=(firsthash+k*k)%hashtable->size;
if(hashtable->data[hashval]==NULL)
return hashval;
}
return -1;
}
void AddDataToMap(HASHTABLE *hashtable ,WORDSET *newdata)
{
unsigned int hashval;
hashval=MakeHASH2(newdata->english,hashtable->size);
if(hashtable->data[hashval]!=NULL)
{ hashval=ReHash(hashtable,hashval);
if(hashval==-1)
{
printf("%sをマップに挿入しようと試みましたが空き位置がありませんでした\n"
,newdata->english);
return;
}
}
hashtable->data[hashval]=newdata;
}
char *GetDataFromMap(HASHTABLE *hashtable,char *key)
{
unsigned int hashval,k;
WORDSET *word;
hashval=MakeHash2(key,hashtable->size);
for(k=0;k<=hashtable->size/2;++k)
{ word=hashtable->data[(hashval+k*k)%hashtable->size];
if(word!=NULL)
if(strcmp(key,word->english)==0)
return word->japanese;
}
return NULL;
}
WORDSET *DeleteDataFromMap(HASHTABLE *hashtable,char *key)
{
unsigned int hashval,k;
WORDSET *word;
hashval=MakeHash2(key,hashtable->size);
for(k=0;k<=hashtable->size/2;++k)
{ word=hashtable->data[(hashval+k*k)%hashtable->size];
if(word!=NULL)
{
if(strcmp(key,word->english)==0)
{
hashtable->data
[(hashval+k*k)%hashtable->size]=NULL;
return word;
}
}
}
return NULL;
}
void InitHashTable(HASHTABLE *hashtable, unsigned int size)
{ hashtable->data=(WORDSET**)malloc(sizeof(WORDSET*)*size);
memset(hashtable->data,NULL,sizeof(WORDSET*)*size);
hashtable->size=size;
}
void CleanupHashTable(HASHTABLE *hashtable)
{ free(hashtable->data);
hashtable->size=0;
}
void PrintALLData(HASHTABLE *hashtable)
{
unsigned int n;
for(n=0;n<hashtable->size;++n)
if(hashtable->data[n]->english
,hashtable->data[n]->japanese);
}
int main (void){
unsigned int n;
char key[64],*japanese;
HASHTABLE hashtable;
WORDSET *wordfound;
WORDSET words[5]={
{"dolphin","イルカ"},{"beluga","シロイルカ"},
{"gramus","シャチ"},{"mdusa","海月"},{"otter","カワウソ"}
};
InitHashTable(&hashtable,503);
for(n=0;n<5;++n)
AddDataToMap(&hashtable,&words[n]);
do
{
printf("どの操作を行いますか?(1:検索2:削徐3:全表示 0:終了)\n");
scanf("%d",&n);
switch(n){
case 1:
printf("検索する英単語を入力してください:");
scanf("%s",key);
japanese=GetDataFromMap(&hashtable,key);
if(japanese!=NULL)
printf("%sの和訳は%sです。\n",key,japanese);
else
printf("%sがマップのなかに見つかりませんでした。\n",key);
break;
case 2:
printf("削除する英単語を入力してください:");
scanf("%s",key);
wordfound=DeleteDataFromMap(&hashtable,key);
if(wordfound!=NULL)
printf("%sをマップから削除しました。\n",key);
else
printf("%sがマップのなかに見つかりませんでした。\n",key);
break;
case 3:
PrintAllData(&hashtable);
break;
}
}while(n!=0);
CleanHashTable(&hashtable);
return (0);
}
book7.c: In function 'InitHashTable':
book7.c:114:3: warning: passing argument 2 of 'memset' makes integer from pointe
r without a cast [enabled by default]
memset(hashtable->data,NULL,sizeof(WORDSET*)*size);
^
In file included from book7.c:2:0:
c:\mingw\include\string.h:52:39: note: expected 'int' but argument is of type 'v
oid *'
_CRTIMP void* __cdecl __MINGW_NOTHROW memset (void*, int, size_t);
^
book7.c: In function 'main':
book7.c:141:65: warning: missing terminating " character [enabled by default]
{"gramus","シャチ"},{"mdusa","海月"},{"otter","カワウソ"}
^
book7.c:141:19: error: missing terminating " character
{"gramus","シャチ"},{"mdusa","海月"},{"otter","カワウソ"}
^
book7.c:142:19: error: expected '}' before ';' token
};
^
book7.c:149:14: warning: unknown escape sequence: '\216' [enabled by default]
printf("どの操作を行いますか?(1:検索2:削徐3:全表示 0:終了)\n");
^
book7.c:183:1: error: expected ',' or ';' at end of input
}
^
book7.c:183:1: error: expected declaration or statement at end of input
C:\Users\延孝>gcc book7.c -o book7
book7.c: In function 'InitHashTable':
book7.c:114:3: warning: passing argument 2 of 'memset' makes integer from pointe
r without a cast [enabled by default]
memset(hashtable->data,NULL,sizeof(WORDSET*)*size);
^
In file included from book7.c:2:0:
c:\mingw\include\string.h:52:39: note: expected 'int' but argument is of type 'v
oid *'
_CRTIMP void* __cdecl __MINGW_NOTHROW memset (void*, int, size_t);
^
book7.c: In function 'main':
book7.c:141:65: warning: missing terminating " character [enabled by default]
{"gramus","シャチ"},{"mdusa","海月"},{"otter","カワウソ"}
^
book7.c:141:19: error: missing terminating " character
{"gramus","シャチ"},{"mdusa","海月"},{"otter","カワウソ"}
^
book7.c:142:19: error: expected '}' before ';' token
};
^
book7.c:149:14: warning: unknown escape sequence: '\216' [enabled by default]
printf("どの操作を行いますか?(1:検索2:削徐3:全表示 0:終了)\n");
^
book7.c:183:1: error: expected ',' or ';' at end of input
}
^
book7.c:183:1: error: expected declaration or statement at end of input
お返事お願いします。