1

我有一个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]并且列表将像这样增长。

4

2 回答 2

0

看来你需要一点帮助才能开始。看起来你被要求实现一个哈希表。在C您使用malloc分配动态存储时,在C++您使用new时,请参阅在什么情况下我使用 malloc 与 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;
}
于 2013-03-04T04:26:31.650 回答
0

好吧,我想我明白了,但我可能会走偏。

重要提示:这是 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

要改变的事情:

  1. 这不是针对您的问题设置的。这是故意的;如果我为你做,你什么也学不到!
  2. 键数组在编译时具有固定大小。看看您是否可以将其与@amdn 的示例混合以让用户选择尺寸。
  3. 根本不需要 ItemList 结构。我只是为了清楚起见才包括它。看看能不能去掉。
  4. 这使用全局值,这通常是一个坏主意。您应该使用对象方法,但现在这对您来说可能有点高级。

如果你真的需要这样做,你应该看看这些为你做这一切的标准对象:

于 2013-03-04T05:00:12.127 回答