1

1つの例に2つの構造を追加しようとしています。

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

あなたのソリューションには多くの問題があります。

list_nodeここで、 (あなたが呼ぶlist)へのポインタを作成します。

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

l2...次に、そのポインタを!で上書きして、そのノードを破棄します。

k=l2;

ここでは、最初の引数として、の代わりにl1(a )を渡します。listint

k=add(l1,k);
于 2012-07-27T06:55:03.263 に答える
0

listタイプはだと思いstruct 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);
}

タイプ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;
}
于 2012-07-27T07:04:27.707 に答える