OK、私は理解していると思いますが、私は道に迷っているかもしれません。
重要な注意:これはC ++ですが、実際にCを使用していないかどうかはわかりません(より複雑です)。これまでに投稿したコードと実行しようとしているタスクは、Cのように感じます。
まず、リンクリストの簡単な紹介です。それらには「head」要素があり、各要素はリスト内の次の要素を指します。
struct Item {
Item *next;
// data here
};
struct ItemList {
Item *first;
};
ItemList myList;
myList.first = new Item( );
myList.first->next = new Item( );
myList.first->next->next = new Item( );
これはリンクリストを設定するためのばかげた方法ですが、構造を示しています。各要素を一度に1つずつ調べて、ノードを見つけます。
リンクリストを使用するハッシュテーブルが必要です(私が収集できるものから)。つまり、リンクリストの固定長配列と、それにアイテムを追加する機能があります。
struct Item {
Item *next;
int key;
int something;
};
struct ItemList {
Item *first;
};
const int NUM_BUCKETS = 3;
ItemList keys[NUM_BUCKETS];
Item *addItemKey( int key, Item *o ) {
int index = key % NUM_BUCKETS;
if( keys[index].first != NULL ) {
o->next = keys[index].first;
}
o->key = key;
keys[index].first = o;
return o;
}
int main( ) {
Item *myItem1 = addItemKey( 10, new Item( ) );
myItem1->something = 7;
Item *myItem2 = addItemKey( 5, new Item( ) );
myItem2->something = 3;
}
それで、それは何をしますか?addItemKeyは、指定したアイテムをハッシュテーブルの「バケット」の1つに配置します。そこにすでにアイテムがあった場合、それは2番目のアイテムになるようにプッシュします。また、便宜のためにアイテムを返します。ここで何が起こっているのかを理解することが重要なので、この投稿の最後にリンクしているサンプルで遊んでみてください。
キーからアイテムを見つけるには、インデックスを再度計算し、アイテムの1つが一致するまで対応するリストをループする必要があります。
Item *findItemKey( int key ) {
int index = key % NUM_BUCKETS;
Item *test = keys[index].first;
while( test != NULL ) {
if( test->key == key ) {
return test;
}
test = test->next;
}
return NULL;
}
int main( ) {
// set up the items as before here
Item *myFoundItem = findItemKey( 10 );
if( myFoundItem != NULL ) {
cout << myFoundItem->something << endl; // should say 7 with the code above
}
}
ここで動作することを確認してください:http://codepad.org/b03NxST2
変更するもの:
- これはあなたの問題のために設定されていません。これは意図的なものです。私があなたのためにそれをしたなら、あなたは何も学ばないでしょう!
- キー配列は、コンパイル時に固定サイズになります。これを@amdnのサンプルと組み合わせて、ユーザーがサイズを選択できるかどうかを確認してください。
- ItemList構造体は実際にはまったく必要ありません。わかりやすくするためにのみ含めました。削除できるかどうかを確認してください。
- これはグローバルな値を使用しますが、これは一般的には悪い考えです。オブジェクトメソッドを使用する必要がありますが、それはおそらく今のところ少し進んでいます。
これを実際に行う必要がある場合は、これらすべてを行う標準オブジェクトを確認する必要があります。