附加两个结构

时间:2012-07-27 06:41:37

标签: c gcc

我试图将两个结构合二为一 实施例

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

3 个答案:

答案 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)

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

如果您希望将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;
}