2017-12-25 17 views
0

나는 개인 학습 Skiena의 "알고리즘 디자인 매뉴얼"을 읽고있다, 그리고 나는 내가 insert_list() 기능을 어떻게 사용합니까 C.링크 된 목록

에 연결리스트를 구현하고 내 목록을 인쇄하려고 테스트 값을 확인 하시겠습니까? 내가 제대로이 문제를 어떻게 사용합니까 expected 'struct list **' but argument is of type 'struct list *

을 :

int main(void) { 
    struct list *root; 
struct list *traverse; 
    root = (struct list *)malloc(sizeof(struct list)); 
    root->next = 0; 
    root->item = 5; 
    traverse = root; 
    insert_list(traverse, 1); /* this is the problem */ 
    printf("%d\n", root->item); 
} 

내가 GCC로 컴파일에서 오류가 발생 :

/* definition of linked list */ 
typedef struct list { 
    int item; 
    struct list *next; 
} list; 
/* insert item into list */ 
void insert_list(list **l, int x) { 
    list *p; 
    p = malloc(sizeof(list)); 
    p->item = x; 
    p->next = *l; 
    *l = p; 
} 

나는 시도하고 insert_list() 사용하는 방법을 알아낼 수있는 주요 기능을 썼다 함수를 사용하여 항목을 삽입 한 다음 내 목록을 인쇄합니까? insert_list() 호출이 없으면 root-> item을 예상대로 5로 인쇄합니다.

+2

insert_list (& traverse, 1); – OldProgrammer

답변

2

좋은 기능이 있습니다. 자 : 사용하십시오. 코멘트에서 언급 한 바와 같이


int main(void) { 
    // You have a typedef, so you should omit the struct keyword 
    /*struct */ list *root= NULL, *p; 

    insert_list(&root, 5);  
    insert_list(&root, 1); 

    for (p=root; p; p=p->next){ 
     printf("%d\n", p->item); 
     } 

return 0; 
} 
1

, 그것은 컴파일 얻을 수있는 방법은 이것에 insert_list()에 전화를 변경하는 것입니다 :

insert_list(&traverse, 1); 

insert_list() 함수는 포인터에 대한 포인터 소요struct list에 대한 포인터가 아니라 struct list으로 지정합니다.

이상한 방식으로 코드를 작성했습니다. 처음에 traverseroot과 같게 지정하고 insert_list() 함수를 호출하면 traverse에 작성한 새 노드의 포인터를 덮어 씁니다. 이 시점에서 새 노드는 원래 만든 root 노드가 아닌 트리의 "루트"가됩니다. 나중에 목록을 탐색하려고하면 혼동이 발생할 수 있습니다.