我有struct
这样:
struct Key_Node
{
int key;
struct Package_Node *next_package;
};
我将创建一个动态数组“struct Key_Node arrayMain[X]
”,其中X
的值将由用户输入,并根据它我将创建动态数组。
由于我不知道数组的大小,显然我无法将动态数组的每个指针指向某个东西。那我在这里要做什么呢?
我有另一个struct
看起来像这样。
struct Package_Node
{
int bar_code;
float package_weight;
struct Package_Node *next_packaged;
};
Key_Node mainArray[dynamicvalue]
和
package_node totalPackages[dynamicvalue]
是按顺序的动态数组和链接列表。我将创建随机包,并使用哈希表方法对它们进行排序。如果我的X
为3且我的随机条形码为10,我将执行10 % 3
,结果为1,因此随机package_node
将添加到mainArray[1]
,列表将会像那样成长。
答案 0 :(得分:0)
您似乎需要一些帮助才能帮助您入门。看起来您被要求实施hash table。在C
中,您使用malloc
分配动态存储空间,在C++
中使用new
,请参阅In what cases do I use malloc vs new?
这应该让你开始,希望它有所帮助。
#include <iostream>
struct Key_Node
{
int key;
struct Package_Node *next_package;
};
struct Package_Node
{
int bar_code;
float package_weight;
struct Package_Node *next_packaged;
};
int main() {
size_t X;
std::cout << "Enter X: ";
std::cin >> X;
Key_Node *mainArray = new Key_Node[X];
for(size_t i=0; i<X; ++i) {
mainArray[i].next_package = NULL;
}
//-- Rest of your program goes here
delete [] mainArray;
return 0;
}
答案 1 :(得分:0)
好吧,我想我明白了,但我可能会离开。
重要提示:这是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( );
这是一种设置链表的愚蠢方式,但展示了结构;我们通过逐个浏览每个元素来找到节点。
你想要一个使用链表的哈希表(从我可以收集的内容)。这意味着你将拥有一个固定长度的链表列表,并能够向其中添加项目:
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放入哈希表的“桶”之一。如果那里已经有一个项目,它会推动它成为第二个项目。它还返回项目以方便。重要的是你要了解这里发生了什么,所以花一些时间玩这篇文章末尾的链接示例。
要从键中查找项目,您必须再次计算 index 并循环显示相应的列表,直到其中一个项目匹配为止:
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
要改变的事情:
如果您需要真实地执行此操作,您应该查看这些为您完成所有这些操作的标准对象: