1

我正在尝试将两个结构附加到一个 Ex 中。

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

3 回答 3

2
list myappend(list l1,list l2){ 
   list k = l1;
   while (k->rest != NULL)
   {
     k = k->rest;
   }
   k->rest = l2;
   return l1; 
}

应该为你工作。

于 2012-07-27T06:47:43.203 回答
0

我猜类型liststruct 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);
}

如果要将类型保持liststruct 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;
}
于 2012-07-27T07:04:27.707 回答
0

您的解决方案存在许多问题。

在这里,您创建一个指向list_node(您称之为list)的指针...

list k = malloc(sizeof(struct list_node));

l2...然后您通过用!覆盖该指针来丢弃该节点

k=l2;

在这里,您传递l1(a list) 而不是 a int, 作为第一个参数。

k=add(l1,k);
于 2012-07-27T06:55:03.263 回答