ポインタの扱い
すみません、構造体へのポインタの配列の扱いに困っています。
下記ソースの
struct list *hashtable[HASHSIZE];
の箇所をmain部に入れた場合の処理がうまくいきません。。
どのように修正すれば良いのでしょうか。
申し訳ありませんが教えてください。
---------------------
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define HASHSIZE 40
#define MAX_KW_LEN 256
#define NUM_KW 23
#define TRUE 1
#define FALSE 0
struct list {
char keyword[MAX_KW_LEN];
struct list *next;
};
struct list *hashtable[HASHSIZE];
static char kw[NUM_KW][MAX_KW_LEN] = {
"auto", "break", "double",
"enum", "char", "continue", "extern", "float", "for", "int",
"long", "register", "short", "signed", "static",
"struct", "typedef", "union", "unsigned", "return",
"void", "volatile", "while"
};
int Hash(char *key);
void InitHTable(void);
int FindKeyWord(char *key);
void ListKeyWord(void);
void FreeKeyWord(void);
int main(void);
int Hash(char *key)
{
int hashval = 0;
while (*key != '\0')
hashval += *key++;
return (hashval % HASHSIZE);
}
void InitHTable(void)
{
int i;
struct list *p, *q;
int hashval;
for (i = 0; i < NUM_KW; i++) {
printf("%d\n",i);
if ((FindKeyWord(kw[i])) == FALSE) {
if ((p = (struct list *)malloc(sizeof(struct list))) == NULL) {
fprintf(stderr, "メモリ不足です。\n");
exit(2);
}
strcpy((*p).keyword, kw[i]);
hashval = Hash(kw[i]);
if (hashtable[hashval] == NULL) {
hashtable[hashval] = p;
p->next = NULL;
}
else {
q = hashtable[hashval];
while (q->next != NULL) {
q = q->next;
}
q->next = p;
p->next = NULL;
}
}
}
}
int FindKeyWord(char *key)
{
struct list *p;
for (p = hashtable[Hash(key)]; p != NULL; p = p->next)
if (!strcmp(key, (*p).keyword))
return (TRUE);
return (FALSE);
}
void ListKeyWord(void)
{
int i;
struct list *p;
for (i = 0; i < HASHSIZE; i++)
for (p = hashtable[i]; p != NULL; p = p->next)
printf("予約語:%s ハッシュ値:%d:\n", (*p).keyword, Hash((*p).keyword));
}
void FreeKeyWord(void)
{
int i;
struct list *p, *q;
for (i = 0; i < HASHSIZE; i++)
for (p = hashtable[i]; p != NULL; ) {
q = p->next;
free(p);
p = q;
}
}
int main(void)
{
char word[MAX_KW_LEN];
int i;
InitHTable( );
ListKeyWord( );
for (i = 0; i < 4; i++) {
printf("Cの予約語を入力して下さい ");
fgets(word, 128, stdin);
if ((FindKeyWord(word)) == TRUE)
printf("%s は登録済みです。\n", word);
else
printf("%s は未登録です。\n", word);
}
FreeKeyWord( );
}