構造体へのポインタ
すみません、構造体へのポインタの配列の扱いに困っています。
下記ソースの
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; /* 次の list へのポインタ */
};
struct list *hashtable[HASHSIZE]; /* ハッシュテーブル */
/* キーワード ( Cの予約語 ) */
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 の指すアドレスを登録 */
p->next = NULL; /* リストの末尾に NULL を追加 */
}
else { /* 既に登録していたら */
q = hashtable[hashval];
while (q->next != NULL) { /* データがなくなるまで */
q = q->next; /* リストをたどる */
}
q->next = p; /* リストの末尾に p の指すアドレスを登録 */
p->next = NULL; /* その末尾に 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); /* TRUE を返す */
return (FALSE); /* 未登録ならFALSE を返す */
}
void ListKeyWord(void)
{
int i;
struct list *p;
for (i = 0; i < HASHSIZE; i++)
for (p = hashtable[i]; p != NULL; p = p->next) /* p が NULL でなければ */
/* ハッシュ値とキーワードを表示 */
printf("予約語:%s ハッシュ値:%d:\n", (*p).keyword, Hash((*p).keyword));
}
/* malloc( ) で割り付けたメモリを解放 */
void FreeKeyWord(void)
{
int i;
struct list *p, *q;
for (i = 0; i < HASHSIZE; i++)
for (p = hashtable[i]; p != NULL; ) { /* p が NULL でなければ */
q = p->next; /* p->next を保存 */
free(p); /* メモリを解放 */
p = q; /* p->next を p に代入 */
}
}
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( );
}
お礼
有り難うございました。