老親介護に悩む30~60代の方へ
老親介護ねっと[老人ホーム編]
トップ 老人ホームの選び方 介護関連ニュース 新規オープンホーム情報 老人ホーム取材レポート お問い合わせ リンク集 Q&A

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語のプログラム

以下のプログラムはハッシュテーブルを用いて文字列を探すプログラムなのですが、コンパイル時にセグメントエラーとなってしまいます。プログラム中に誤った箇所があれば教えて頂きたいです。

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

#define HASHSIZE 10
#define MAX_LEN 64
#define N_WORDS 4

struct list {
char word [MAX_LEN];
struct list *next;
};

struct list *hash_table[HASHSIZE];
char colors[N_WORDS][MAX_LEN] = {"red", "blue", "green", "yellow"};

void my_strcpy(char* a, const char* b)
{
int i = 0;
while(*b != '\0'){
*(a+i) = *(b+i);
i++;
}
*(a+i) = '\0';
}

int hash(char *key)
{
int hashval = 0;
while (*key != '\0') {
hashval += *key;
key++;
}
return (hashval % HASHSIZE);
}

int find_word (char *key)
{
struct list *p;
for (p = hash_table[hash(key)]; p != NULL; p++)
if (strcmp(key, p->word) == 0) return 1;
return 0;
}

void init_hash_table()
{
int i, hashvalue;
struct list *p, *q;
for (i = 0; i < HASHSIZE; i++) { hash_table[i] = NULL; }
for (i = 0; i < N_WORDS; i++) {
if ((find_word(colors[i])) == 0){
p = (struct list *)malloc(sizeof(struct list));

my_strcpy(p->word, colors[i]);
hashvalue = hash(colors[i]);

if (hash_table[hashvalue] = NULL) {
hash_table[hashvalue] = p;
p->next=NULL;
} else {
q = hash_table[hashvalue];
while (q->next != NULL) q = q->next;
q->next = p;
p->next=NULL;
}
}
}
}


void main(void)
{
init_hash_table();
printf("result = %d\n", find_word("red"));
}

投稿日時 - 2018-06-09 16:52:17

QNo.9506657

困ってます

質問者が選んだベストアンサー

>あと、お手数ですが具体的にどのように改変すればよいか教えていただけると幸いです。

どのようにすればよいと思いますか?
まずはご自分でお考えください。

>if (hash_table[hashvalue] = NULL) {

については、よく見ればわかることですし

find_word()をどう書き換えればいいかはinit_hash_table()が何をやっているのか理解していればわかるはずです。

まぁ私以外の誰かが書いてしまうかもしれませんけど。

投稿日時 - 2018-06-11 23:15:29

お礼

ありがとうございます。おかげで理解することが出来ました。余談ですがmy_strcpy()にもミスがありました。

投稿日時 - 2018-06-12 11:17:19

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

#1です。
書き忘れていましたが情報はできるだけ正確に書きましょう。
質問には「コンパイル時にセグメントエラーとなってしまいます。」と書かれていますが、
本当にコンパイル時にセグメントエラーが起きるのでしたら、
それはコンパイラーのバグという事になってしまいます(コンパイル時に動いているのはコンパイラーであって、あなたの書かれたプログラムではありません)。

投稿日時 - 2018-06-09 17:39:17

ANo.1

init_hash_table()中の
>if (hash_table[hashvalue] = NULL) {

とfind_word()中の
>for (p = hash_table[hash(key)]; p != NULL; p++)

init_hash_table()ではハッシュ値が同一のものにたいしてはリンクドリストでデータ保持しているのにfind_word()は配列内を探すようになってます。

投稿日時 - 2018-06-09 17:24:50

補足

失礼いたしました。セグメントエラーが起きるのはコンパイル後です。
あと、お手数ですが具体的にどのように改変すればよいか教えていただけると幸いです。

投稿日時 - 2018-06-11 16:18:37