我试图将两个结构合二为一 实施例
l1 = add(1, add(2, NULL));
l2 = add(3, add(4, NULL));
myappend(l1,l2) = add(1,add(2,add(3,add(4,NULL))))
我尝试了很多其他我能想到的方法......但它没有用......任何人都可以帮助我吗?
struct list_node {
struct list_node * rest;
int first;
};
list add(int in, list l) {
list r = malloc(sizeof(struct list_node));
r->first = in;
r->rest = l;
return r;
}
// My attempted solution;
list myappend(list l1,list l2){
list k = malloc(sizeof(struct list_node));
k=l2;
k=add(l1,k);
return k;
}
答案 0 :(得分:2)
list myappend(list l1,list l2){
list k = l1;
while (k->rest != NULL)
{
k = k->rest;
}
k->rest = l2;
return l1;
}
应该适合你。
答案 1 :(得分:0)
您的解决方案存在许多问题。
在此创建指向list_node
的指针(您称之为list
)...
list k = malloc(sizeof(struct list_node));
...然后通过用l2
覆盖该指针来抛弃该节点!
k=l2;
在这里,您传递l1
(一个list
)而不是int
作为第一个参数。
k=add(l1,k);
答案 2 :(得分:0)
我猜类型list
是struct list_node *
。如果您可以为list
定义类型,则可以为list
定义一个类型,其中last
指向列表的最后一个节点,例如:
struct list {
struct list_node *first;
struct list_node *last;
}
void myappend(struct list *l1,struct list *l2){
// check the argument here when needed.
l1->last->rest = l2->first;
l1->last = l2->last;
free(l2);
}
如果您希望将list
类型保留为struct list_node *
,则应该
1)确保(列表的)rest
的最后一个节点为NULL。
2)循环并找到第一个列表的最后一个节点并进行合并(只链接它们)。
您还可以使用递归代码:
list __add(struct list_node *first_node, list rest) { // split your list_add()
first_node->rest = rest;
return first_node
}
list add(int in, list l) {
list r = malloc(sizeof(struct list_node));
r->rest = NULL;
r->first = in;
return __add(r, l);
}
list myappend(list l1,list l2){
if (l1)
return __add(l1, myappend(l1->rest, l2));
else
return l2;
}