2012-07-27 98 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);