如何将动态数组中的数组指向某个东西?

时间:2013-03-04 03:01:28

标签: c++ arrays dynamic linked-list

我有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],列表将会像那样成长。

2 个答案:

答案 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

要改变的事情:

  1. 这不是针对您的问题设置的。那是故意的;如果我为你做了,你就不会学到任何东西!
  2. keys数组在编译时具有固定大小。看看你是否可以将它与@ amdn的样本混合,让用户选择一个大小。
  3. 完全不需要ItemList结构;为清楚起见,我只包括它。看看你是否可以删除它。
  4. 这使用全局值,这通常是一个坏主意。你应该使用对象方法,但这对你来说可能有点先进。
  5. 如果您需要真实地执行此操作,您应该查看这些为您完成所有这些操作的标准对象: