2013-03-10 5 views
2

Я пытаюсь дублировать узел в связанном списке. Я не уверен, правильно ли я делаю это. Я пробовал делать тестовые примеры, но они не были успешными. Если кто-то может сказать мне, где я ошибся и что я сделал правильно, также как лучше всего проверить свой код.Копирование узлов в связанном списке C

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; 
    } 
} 

Я внесла изменения в свой код и добавил больше описания того, что хочет эта функция. одно изменение: struct node - порядок структуры.

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; 

} 
+2

Каков был твой тест? Каков был результат? –

+0

мой тестовый пример никогда не скомпилирован. поэтому я удалил его, чтобы проверить. Наверное, я не уверен, как сделать тестовый пример. то, что я сделал, это сделать новый узел (который собирался быть узлом данных) , называемый newnode, и передал узел, который я сделал. – Eciliptus

+4

Вам не нужно указывать возвращаемое значение 'malloc' в программе на языке C. –

ответ

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; 
    } 

Возможно, вы должны вернуть узел.

Как Карл отметил, вы не должны отбрасывать возвращаемое значение из malloc() - если ваш компилятор complains об этом, это, вероятно, потому, что вы компилируете код как C++, а не как С.

Edit: в обновленный код:

*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; 

B

linkedlist->next->prev = NULL; 

C

А и B делает то же самое, так что один из них является излишним.

C почти наверняка разрушит ваш код, так как next не был настроен ни на что. Вы, вероятно, хотите использовать linkedlist->next = NULL и linkedlist->prev = NULL

1

Суть вашей проблемы заключается в том, что вы создаете две новые node объекты - тот, который dataValue и тот, который linkedlist->data. Затем вы копируете переданные данные в dataValue, когда вы действительно хотите, чтобы он хранился в linkedlist->data.

Если заменить

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

с

linkedList->data = dataValue; 

, которые должны заставить вас двигаться в правильном направлении.

0

Потому что порядок структуры - тип 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; 
}