我正在尝试复制链接列表中的节点。我不确定我是否正确地做到了。我试过制作测试用例,但他们没有成功。如果有人能告诉我出错的地方和我做得对的地方,那么测试我的代码的最佳方法是什么。
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;
}
答案 0 :(得分:1)
问题的关键在于您要创建两个新的node
个对象 - 一个是dataValue
,另一个是linkedlist->data
。然后,当您确实希望将传入的数据存储在dataValue
中时,将其复制到linkedlist->data
。
如果您更换
linkedlist ->data = (struct node*)malloc(sizeof(data)+1);
与
linkedList->data = dataValue;
应该让你朝着正确的方向前进。
答案 1 :(得分: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 < / p>
编辑:在更新的代码中:
*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;
乙
linkedlist->next->prev = NULL;
C
A和B做同样的事情,所以其中一个是多余的。
C几乎肯定会使代码崩溃,因为next
尚未设置为任何内容。您可能希望使用linkedlist->next = NULL
和linkedlist->prev = NULL
答案 2 :(得分: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;
}