2

リンク リストでノードを複製しようとしています。私はそれを正しく行っているかどうかわかりません。テスト ケースを作成しようとしましたが、成功しませんでした。どこが間違っていて、何が正しかったかを誰かが教えてくれたら、コードをテストするための最良の方法も教えてくれます。

struct node 
{
        int id;
        char side;
        int quantity;
        double price;
};

struct onode 
{
        struct node* data;
        struct onode* next;
        struct onode* prev;
};

struct onode* newNode (struct node* data)

{
    struct node* dataValue  = (struct node*) malloc(sizeof(struct node));
    struct onode* linkedlist = (struct onode*) malloc(sizeof(struct onode));

    linkedlist ->data = (struct node*)malloc(sizeof(data)+1);

    if(dataValue && data)
    {
        *dataValue = *data;
    }
}

コードに変更を加え、この関数が必要とするものについての説明を追加しました。1 つの変更: 構造体ノードは構造体の順序です。

struct order 
{
        int id;
        char side;
        int quantity;
        double price;
};

struct onode 
{
        struct order* data;
        struct onode* next;
        struct onode* prev;
};


/**
 * Returns a new linked list node filled in with the given order, The function
 * allocates a new order and copy the values stored in data then allocate a 
 * linked list node. If you are implementing this function make sure that you
 * duplicate, as the original data may be modified by the calling function.
 */

struct onode* newNode (struct order* data)
{
    struct order* dataValue  = (struct order*) malloc(sizeof(struct order));
    struct onode* linkedlist = (struct onode*) malloc(sizeof(struct onode));

    *dataValue = *data;

    linkedlist ->data = dataValue;

    linkedlist->data->id = dataValue->id;
    linkedlist->data->price = dataValue->price;
    linkedlist->data->quantity = dataValue->quantity;
    linkedlist->data->side = dataValue->side;
    linkedlist->next->prev = NULL;

    return linkedlist;

}
4

3 に答える 3

1

問題の核心は、2つの新しいnodeオブジェクトを作成していることです。1つはです。dataValueもう1つはですlinkedlist->data。次に、渡されたデータdataValueを本当に保存したいときにコピーしますlinkedlist->data

交換する場合

linkedlist ->data = (struct node*)malloc(sizeof(data)+1);

linkedList->data = dataValue;

それはあなたを正しい方向に動かすはずです。

于 2013-03-10T23:06:08.990 に答える
0

コードには質問に答えるために必要なコード/説明が含まれていないため、これは適切な答えではありません。

struct onode* newNode (struct node* data)
{
    struct order* dataValue  = (struct node*) malloc(sizeof(struct node));
}

なにstruct order*?つまりstruct node *

    struct onode* linkedlist = (struct onode*) malloc(sizeof(struct onode));

    linkedlist ->data = (struct node*)malloc(sizeof(data)+1);

上記の行は間違っているようです- sizeof(data) + 1?文字列ではないため、文字列を追加しても意味がありません。サイズはポインタのサイズであり、おそらく必要なサイズではありません。代わりにあなたが欲しいと思いlinkedList->data = dataValue;ます。

nextそして、とprevポインタをに設定する必要がありますlinkedList

    if(dataValue && data)
    {
        *dataValue = *data;
    }

おそらくノードを返すことになっています。

Carlが指摘したように、戻り値をキャストするべきではありませんmalloc()。コンパイラーcomplainsがそれについての場合、コードをCではなくC++としてコンパイルしていることが原因である可能性があります。

編集:更新されたコード内:

*dataValue = *data;

A

linkedlist ->data = dataValue;

linkedlist->data->id = dataValue->id;
linkedlist->data->price = dataValue->price;
linkedlist->data->quantity = dataValue->quantity;
linkedlist->data->side = dataValue->side;

B

linkedlist->next->prev = NULL; 

C

AとBは同じことをするので、そのうちの1つは冗長です。

next何も設定されていないため、Cはほぼ確実にコードをクラッシュさせます。linkedlist->next = NULLあなたはおそらく使用したいと思いますlinkedlist->prev = NULL

于 2013-03-10T22:54:59.903 に答える
0

struct order は POD 型なので、物事は非常に単純です。

struct onode* newNode (struct order* data)
{
    struct order* dataValue;
    struct onode* linkedlist;

    If (!data)
    {
        /* Feel free to use any other strategy to
         * handle data == NULL case depending
         * on the needs of your application. */
        return NULL;
    }

    dataValue = malloc(sizeof(struct order));
    linkedlist = malloc(sizeof(struct onode));

    memcpy(dataValue, data, sizeof(*dataValue))

    linkedlist->data = dataValue;

    linkedlist->next = NULL;
    linkedlist->prev = NULL;

    return linkedlist;
}
于 2013-03-10T23:56:08.440 に答える