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]

順番に動的配列と連結リストです。ランダムなパッケージを作成し、ハッシュテーブル メソッドを使用して並べ替えます。myXが 3 でランダム バーコードが 10 の場合、10 % 3どちらの結果が 1 かということになるので、ランダムpackage_nodeが追加されmainArray[1]、リストはそのように大きくなります。

4

2 に答える 2

0

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

変更するもの:

  1. これはあなたの問題のために設定されていません。これは意図的なものです。私があなたのためにそれをしたなら、あなたは何も学ばないでしょう!
  2. キー配列は、コンパイル時に固定サイズになります。これを@amdnのサンプルと組み合わせて、ユーザーがサイズを選択できるかどうかを確認してください。
  3. ItemList構造体は実際にはまったく必要ありません。わかりやすくするためにのみ含めました。削除できるかどうかを確認してください。
  4. これはグローバルな値を使用しますが、これは一般的には悪い考えです。オブジェクトメソッドを使用する必要がありますが、それはおそらく今のところ少し進んでいます。

これを実際に行う必要がある場合は、これらすべてを行う標準オブジェクトを確認する必要があります。

于 2013-03-04T05:00:12.127 に答える
0

始めるには少し助けが必要なようです。ハッシュ テーブルの実装を求められているようです。動的ストレージの割り当てに使用する場合Cは、 「 malloc と new を使用するのはどのような場合ですか?」を参照してください。mallocC++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 に答える