2012-07-27 4 views
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; 
} 
+0

는 "작동하지 않습니다"- 더 정확하게 :

또한 재귀 코드를 사용할 수 있습니까? –

+0

"내가 생각할 수있는 다른 많은 방법을 시도했다"같은가? –

+0

"목록"에 대한 정의가 표시되지 않습니다. 이게 뭐야? – wildplasser

답변

0

liststruct list_node *입니다. 당신이 list의 유형을 정의 할 수 있다면, 당신은 목록, 예를의 마지막 노드에 last 포인트 list의 유형을 정의 할 수 있습니다 : 당신이 list, 당신이해야 struct list_node *로 유형을 유지하려면

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

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

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

당신을 위해 작동합니다.

+0

아 감사합니다! 더 효율적인 방법이 궁금합니다. – user1516649

+0

@ user1516649 데이터 구조를 변경하지 않고서는 두렵습니다. –

0

귀하의 솔루션에는 여러 가지 문제가 있습니다. 여기

당신이 (당신이 list을 부르는)을 list_node에 대한 포인터를 만들

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

... 그리고 당신은 l2와 그 포인터를 덮어 써서 멀리 노드를 던져!

k=l2; 

여기 당신은 첫 번째 인수로, 대신 intl1 (A list)를 전달합니다.

k=add(l1,k); 
관련 문제