質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

2回答

814閲覧

ハッシュテーブルを作成したいのですが、、、

takerun_

総合スコア0

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

連結リスト

連結リストとは、データ構造のひとつであるリストの中で、要素が前後の要素の情報を持つことで、要素が連結(リンク)しているリストの事を呼びます。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/07/03 15:34

前提・実現したいこと

3 桁の数値 x に対して,ハッシュ関数の値 h(x) をハッシュテーブルのインデックスとして用い,これを先頭とする線形リストに連結するプログラムを実装しようとしています。

実装中に以下の実行結果が出力されました。

##実行結果

Linear-List:
No. Pointer Linked to

-1 0x7ffc77076d90 0
-1 0x7ffc77076d90 0
-1 0x7ffc77076d90 0
-1 0x7ffc77076d90 0
-1 0x7ffc77076d90 0
-1 0x7ffc77076d90 0
-1 0x7ffc77076d90 0
-1 0x7ffc77076d90 0
-1 0x7ffc77076d90 0
-1 0x7ffc77076d90 0

*** stack smashing detected ***: <unknown> terminated
中止 (コアダンプ)

該当のソースコード

C++言語
ソースコード

#include<iostream>
#include<string>
#include<ctime>

using namespace std;

struct CELL{
int data;
CELL *next;
};

void add_list( CELL * ,int);

void show_hash_table( CELL ** );

int Hash(int);

int main( void ){

const int Hash_NUM = 20;
const int num=10;
int data[num]={99,88,77,66,55,44,33,22,11,0};
int hash[num];

CELL *Hash_Table[num];

for(int i=0;i<Hash_NUM;i++){
Hash_Table[i]=new CELL;
Hash_Table[i]->data=-1;
Hash_Table[i]->next=NULL;
}

for(int i=0;i<num;i++){
hash[i]=Hash(data[i]);

if(hash[i]==i){
add_list(Hash_Table[i],data[i]);
}
}

show_hash_table(Hash_Table->next);

return 0;
}

int Hash(int data){
int hash;
hash=data%20;

return hash;
}

void add_list(CELL *hashtable,int data){

CELL *newcell = new CELL;
while( hashtable->next != NULL ){
hashtable = hashtable->next;
}
newcell->next = hashtable->next;
hashtable->next = newcell;
newcell->data = data;
}

void show_hash_table( CELL **p ){

cout << "-----------------------------" << endl;
cout << " Linear-List: " << endl;
cout << " No. Pointer Linked to" << endl;
cout << "-----------------------------" << endl;
for(int i=0;i<10;i++){

while( p[i] != NULL ){
cout << " " << p[i]->data << " " << p << " " << p[i]->next << endl;
p[i] = p[i]->next; /* 次のセルにポインタを移動 */
}
}

cout << "-----------------------------" << endl;
}

関数add_listは新しい入力に対してハッシュテーブルに線形リストを連結させる関数
関数Hashはハッシュ値を求める関数
関数show_hash_tableはハッシュテーブルを連結順に出力させる関数
です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itagagaki

2021/07/03 16:17

ん-、デバッグを手伝えということですか? 自分でどこまでデバッグしてみたのですか?
episteme

2021/07/04 00:29

しつもんはなんですか?
guest

回答2

0

C++

1#include <iostream> 2#include <iomanip> 3#include <algorithm> 4 5struct CELL { 6 int data; 7 CELL* next; 8 CELL(int d =0) : data(d), next(nullptr) {} 9 CELL* tail() { // 末尾を探す 10 CELL* p = this; 11 CELL* prev = p; 12 while ( p != nullptr ) { 13 prev = p; 14 p = p->next; 15 } 16 return prev; 17 } 18}; 19 20struct HashTable { 21 size_t size; 22 CELL** table; 23 24 HashTable(size_t s) : size(s) { // まえじゅんび 25 table = new CELL*[size]; // size個用意して 26 std::fill(table, table + size, nullptr); // nullptrで埋めておく 27 } 28 29 ~HashTable() { // あとかたづけ:全要素を廃棄する 30 for (int i = 0; i < size; ++i) { 31 CELL* p = table[i]; 32 while ( p != nullptr ) { 33 CELL* tmp = p->next; 34 delete p; 35 p = tmp; 36 } 37 } 38 delete[] table; 39 } 40 41 void add_list(CELL*& list, int value) { // listの末尾にCELLを繋ぐ 42 CELL* last = list->tail(); // 末尾を探し、 43 if ( last == nullptr ) { // なかったら先頭の要素 44 list = new CELL(value); 45 } else { // あったらその直後に繋ぐ 46 last->next = new CELL(value); 47 } 48 } 49 50 void add(int value) { // 挿入:適切な位置にCELLを繋ぐ 51 add_list(table[Hash(value)%size], value); 52 } 53 54 void show() const { 55 std::cout << 56 "-----------------------------\n" 57 " Linear-List: \n" 58 " No. Pointer Linked to\n" 59 "-----------------------------\n"; 60 for ( int i = 0; i < size; ++i ) { 61 for ( CELL* p = table[i]; p != nullptr; p = p->next ) { 62 std::cout << std::right << std::setw(3) << p->data 63 << " " << static_cast<void*>(p) 64 << " " << static_cast<void*>(p->next) 65 << std::endl; 66 } 67 } 68 std::cout << "-----------------------------\n"; 69 } 70 71 int Hash(int data) const { return data; } 72}; 73 74int main(void) { 75 76 const int num = 10; 77 int data[num] = { 99,88,77,66,55,44,33,22,11,0 }; 78 79 HashTable ht(3); 80 81 for (int i = 0; i < num; i++) { 82 ht.add(data[i]); 83 } 84 85 ht.show(); 86 return 0; 87}

投稿2021/07/04 00:38

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

配列の要素数は正しいですか?
ハッシュ値は0~19の範囲になるのですよね?

c++

1const int Hash_NUM = 20; 2const int num=10; 3 4CELL *Hash_Table[num];

これだとハッシュ値がdataのインデックスと一致しないとテーブルに追加されませんが、意図した動作ですか?
例えばdata[0]%20==19になるのでi=0のときはdata[0]はどこにも追加されませんね。

c++

1 2for(int i=0;i<num;i++){ 3 hash[i]=Hash(data[i]); 4 5 if(hash[i]==i){ 6 add_list(Hash_Table[i],data[i]); 7 }

関数に渡す引数の型が合っていません。
宣言ではCELL**なのにCELL*を渡しています。

c++

1show_hash_table(Hash_Table->next);

投稿2021/07/03 16:41

TaroToyotomi

総合スコア1430

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問