2016-10-12 2 views
0

단일 함수에서 링크 된 모든 멤버를 삭제하는 데 어려움을 겪고 있습니다. 아래에서 보는 것처럼 그것을 해체하면 잘 작동하지만 이것은 비효율적으로 보이며이를 수행하는 올바른 방법을 찾아야합니다. 모든 노드를 해제하려면 먼저 다른 노드의 모든 노드를 해제 한 다음 헤드 링크를 해제하는 기능이 있어야합니다. 이것은 쉽게 할 수있는 것처럼 보이지만 문제가 있습니다.함수를 사용하여 이중 포인터로 연결된 목록을 해제하십시오.

도움 주셔서 감사합니다.

int main() { 

    struct node *head = NULL; 
    createList(&head); 

    //do stuff with list 

    freeListMembers(head); 
    freeListHead(&head); 

    return 0; 
} 

int createList(struct node **head) { 
    //create list 
    return 0; 
} 

void freeListMembers(struct node *head){ 
    while(head->next != NULL){ 
     head->next = NULL; 
     free(head->next); 
    } 
    return; 
} 

void freeListHead(struct node **head) { 
    *head = NULL; 
    free(*head); 
    return; 
} 

여기는 내가하고 싶은 코드이지만 그렇지 않습니다. 내가보고있는 문제는 "* head-> next"오류입니다. 이 SAIS 곳 코드에서

int main() { 

    struct node *head = NULL; 
    createList(&head); 

    //do stuff with list 

    freeAllListMembers(&head); 

    return 0; 
} 

int createList(struct node **head) { 
    //create list 
    return 0; 
} 

void freeAllListMembers(struct node **head){ 
    while (head != NULL) { 
     struct node *temp = *head->next; 
     free(*head); 
     *head = temp ; 
    } 
    return; 
} 
+0

당신 * * 머리와 모든 구성원을 해제하는 기능을 수행합니다. 이름은'main()'입니다. 당신의 질문은 더 분명 할 것이고, 당신이 시도한 것을 선물한다면, 당신이 원하는 형태를 가지고 있지만, 그것은 당신을 위해 일하지 않습니다. –

+0

@ 존 볼링거 THanks! 위의 코드에서 작업하고자하는 코드를 추가했습니다. – skevthedev

답변

1

"표현은 구조체의 포인터 또는 노동 조합 유형이 있어야합니다"

void freeListMembers(struct node *head){ 
    while(head->next != NULL){ 
     head->next = NULL; 
     free(head->next); 
    } 
    return; 
} 

이것은 해방 NULL이 아닌 노드를 *.

목록을 비우는 것은 다음 노드에 대한 임시 포인터를 사용하는 것만 큼 간단합니다. 당신의 편집에서

while (head) { 
    node* next = head->next; 
    free(head); 
    head = next; 
} 

:

void freeAllListMembers(struct node **head){ 
    while (head != NULL) { 
     struct node *temp = *head->next; 
     free(*head); 
     *head = temp ; 
    } 
    return; 
} 

이있는 몇 가지 오류가 있습니다. while (*head != NULL)(*head)->next이어야합니다. 첫 번째는 논리 오류입니다. 헤드가 항상 NULL이 아니며 두 번째는 구문 오류입니다. 왜냐하면 다음 포인터에 액세스하기 전에 헤드 포인터를 역 참조해야하기 때문입니다.

+0

@MarcD에 감사드립니다. 원래 제안을 시도했지만 작동하지 않습니다. 위 코드에 조금 더 많은 정보를 추가했습니다. – skevthedev

+0

잘못된 답변을 편집했습니다. 시도한 코드를 사용하십시오. – MarcD

+0

이 효과가 있습니다. 고마워, (머리! = NULL) 그냥 오타 였지만, (* 머리) -> 다음 내가 누락 된 부분이었다, 당신은 왜 parathenses 필요합니까? 이게 정확히 뭐지? 나는 또한 * head = NULL 설정에 대해 생각하고 있었다; 무료 (* 머리); 전에. 그것을 해제하기 전에 null로 포인터를 설정하는 것이 가장 좋은 방법이라고 읽었습니다. 이것은 내 상황에도 맞을까요? – skevthedev

0

이렇게하면됩니다. 방금 머리의 다음을 null로 설정하고 머리를 풀었습니다. 이제 우리는 두 번째 요소로 이동할 수 없습니다. 따라서 우리는 노드를 해제 할 수 없을 것입니다. 기본 조건을 확인하십시오. 나는

void freeListmembers(node *head){ 
node *temp=head; 
if(head==NULL)//Base condition 
return; 
while(head->next!=NULL){ 
temp=head;//Moved temp to head. we will move head to next and free the previous node 
head=head->next; 
free(temp); 
} 
free(head); 
return; 

을} 도움이되기를 바랍니다

+0

이것은 목록을 비우는 아주 명확하고 간결한 방법은 아닙니다. 그것은 작동하지만, 매우 둥근 방식입니다. – MarcD

+0

동의합니다. 그러나 질문을 한 사람의 생각대로 수정하려고했습니다. 그래서 그는 그가하고있는 것을 알 수 있습니다. –

관련 문제