2012-12-17 6 views
5

을 삭제하는 것은 여기에 링크 된 목록을 삭제하는 내 함수의 : 헤드 포인터가 가리키는링크 된 목록 기능

void deleteList(NODE* head) 
{ 
    NODE* temp1; 
    NODE* tempNext; 
    temp1 = head; 
    tempNext = NULL; 

    while(temp1 != NULL) 
    { 
     tempNext = temp1->next; 
     free(temp1); 
     temp1 = tempNext; 
    } 
} 

그래서 TEMP1 첫째 점을. NULL이 아니면 tempNext이 목록의 다음 요소를 가리 키도록 설정됩니다. 그런 다음 첫 번째 요소 (temp1)는 free이고, temp1tempNext이 가리키는 곳을 가리키고 다시 반복됩니다.

이 전체 목록 삭제에 대한 올바른 접근 방식인가? 나는이 기능을 사용 후 목록을 인쇄 할 때, 그것은 여전히 ​​목록을 인쇄하기 때문에

나는이를 부탁드립니다. 그리고 IIRC는 무언가를 해지해도 삭제되지 않지만 사용 가능한 것으로 표시된 것만 큼 올바른지 여부를 알 수 없습니다.

+1

그것은 또한 당신의 목록과 같은 방법에 따라 달라집니다. 데이터에 대한 메모리를 할당 한 경우 (데이터에 대한 포인터가 목록에 포함되어있는 경우), 해당 데이터도 참조 할 수있는 목록이 아닌 해당 데이터를 해제 할 수 있습니다. – Jite

+0

@ Jite : 오, 좋은 지적 ~! 미래를 염두에 두겠다. –

답변

7

코드가 올바르게 표시됩니다.

는 또한리스트의 요소를 확보하는 것은 바로 그들이 가리키는 메모리를 변경하지 않는 것을 맞아요. 장래에 메모리를 힙 관리자에게 재 할당 할 수 있습니다. 당신 때문에 아마, 그것은 여전히 ​​목록을 인쇄

void deleteList(NODE** head) 
{ 
    NODE* temp1 = *head; 
    /* your code as before */ 
    *head = NULL; 
} 
+0

함수의 인수로'pointer-to-pointer'를 주목하라. – Jite

1

: 당신이 클라이언트 코드가 해제 된 목록을 계속 사용하지 않습니다 있는지 확인하려면

, 당신은 deleteList은 또한 NODE 포인터를 NULL로 변경 될 수 있습니다 이 함수를 호출 한 후에 NULL 포인터를 head으로 설정하지 마십시오. free의 차이에 대한 포인터를 보내고 및 포인터를 무효화가있다

1

I ask this because when I print the list after using this function, it still prints the list.

. 당신이 당신의 전체 연결리스트와 머리를 free 경우, 위치 head 모든 next 포인터 지점에서 당신이 더 이상 "자신의"메모리를 의미합니다. 따라서 어떤 값이 있을지 또는 메모리가 유효한지 확인할 수 없습니다.

그러나 링크 된 목록을 해제 한 후에 아무 것도 건드리지 않으면 계속해서 트래버스하고 값을 인쇄 할 수 있습니다.

struct node{ 
    int i; 
    struct node * next; 
}; 

... 
struct node * head = NULL; 
head = malloc(sizeof(struct node)); 
head->i = 5; 
head->next = NULL; 
free(head); 
printf("%d\n", head->i); // The odds are pretty good you'll see "5" here 

위의 코드에서 설명이 참인 동안 포인터를 항상 비워두고 직접 NULL로 설정해야합니다. free()을 호출 한 후 head이 반응하거나 포함하는 방법에 대해 에 대해 가정을 설정하는 것은 위험합니다.

0

이것은 꽤 오래된 질문이지만 누군가 주제에 대한 검색을 수행하는 데 도움이 될 수 있습니다.

내가 최근에 완전히 단독으로 링크 된 목록을 삭제 쓴 것입니다. 스택 공간이 부족한 것을 염려하여 커다란리스트를 포함하는 재귀 알고리즘에 대해 가슴 아픈 사람들이 많이 있습니다. 여기에 반복 버전이 있습니다.

는 그냥 "머리"포인터를 전달하고 함수는 나머지 처리한다 ...

struct Node { 
    int i; 
    struct Node *next; 

}};

void DeleteList(struct Node *Head) { 

    struct Node *p_ptr; 

    p_ptr = Head; 

    while (p_ptr->next != NULL) { 
      p_ptr = p_ptr->next; 
      Head->next = p_ptr->next; 
      free(p_ptr); 
      p_ptr = Head; 
    } 

    free(p_ptr); 

은}