2012-07-27 46 views
1

我试图追加两个结构到一个 例如。追加两个结构

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

“不工作” - 更准确? – 2012-07-27 06:46:09

+0

“我尝试了很多其他我能想到的方式”,比如? – 2012-07-27 06:50:53

+0

我没有看到“列表”的定义。它是什么? – wildplasser 2012-07-27 09:29:42

回答

0

我猜类型liststruct list_node *。如果你能为list定义类型,您可以定义类型listlast点到列表,榜样的最后一个节点:

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

注意:不要使用带有下划线的标识符。他们保留。 – wildplasser 2012-07-27 07:46:28

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

应该为你工作。

+0

啊谢谢!只是想知道有没有更高效的方法? – user1516649 2012-07-27 06:51:03

+0

@ user1516649在不改变数据结构的情况下,恐怕没有。 – 2012-07-27 06:51:58

0

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

在这里,你创建一个指向list_node(您致电list)...

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

...然后你把这个节点路程改写该指针与l2

k=l2; 

在这里传递l1(一个list)代替int,作为第一个参数。

k=add(l1,k);