解決済み

C言語のプログラム

  • 困ってます
  • 質問No.9506657
  • 閲覧数125
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 32% (10/31)

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

#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"));
}

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

  • 回答No.3

ベストアンサー率 28% (1317/4588)

コンピューター カテゴリマスター
>あと、お手数ですが具体的にどのように改変すればよいか教えていただけると幸いです。

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

>if (hash_table[hashvalue] = NULL) {

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

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

まぁ私以外の誰かが書いてしまうかもしれませんけど。
お礼コメント
hikamichael

お礼率 32% (10/31)

ありがとうございます。おかげで理解することが出来ました。余談ですがmy_strcpy()にもミスがありました。
投稿日時 - 2018-06-12 11:17:19
感謝経済

その他の回答 (全2件)

  • 回答No.2

ベストアンサー率 28% (1317/4588)

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

ベストアンサー率 28% (1317/4588)

コンピューター カテゴリマスター
init_hash_table()中の
>if (hash_table[hashvalue] = NULL) {

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

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

お礼率 32% (10/31)

失礼いたしました。セグメントエラーが起きるのはコンパイル後です。
あと、お手数ですが具体的にどのように改変すればよいか教えていただけると幸いです。
投稿日時 - 2018-06-11 16:18:37
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する

特集


感謝指数によるOK-チップ配布スタート!

ピックアップ

ページ先頭へ