好吧,我想我明白了,但我可能会走偏。
重要提示:这是 C++,但我不能确定您实际上没有使用 C(这更复杂)。到目前为止您发布的代码和您尝试执行的任务感觉就像 C。
首先,快速介绍链表。它们有一个“头”元素,然后每个元素指向列表中的下一个元素:
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( );
这是一种设置链表的愚蠢方式,但演示了结构;我们通过一次一个地遍历每个元素来找到节点。
你想要一个使用链表的哈希表(从我能收集到的)。这意味着您将拥有一个固定长度的链表数组,并且能够向其中添加项目:
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 会将您提供的项目放入哈希表的“桶”之一。如果那里已经有一个项目,它将推动它成为第二个项目。为了方便起见,它还返回项目。了解这里发生了什么很重要,因此请花一些时间来玩一下我在本文末尾链接到的示例。
要从键中查找项目,您必须再次计算索引并遍历相应的列表,直到其中一个项目匹配:
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 结构。我只是为了清楚起见才包括它。看看能不能去掉。
- 这使用全局值,这通常是一个坏主意。您应该使用对象方法,但现在这对您来说可能有点高级。
如果你真的需要这样做,你应该看看这些为你做这一切的标准对象: