2014-04-12 1 views
1

이것은 나보다 C 프로그래밍이 뛰어난 사람이 수행합니다. 일부 노드 목록을 만든 후 아래 C에서 free()를 사용하는 것에 혼란 스럽습니다.

C

무료의 사용() 이상 혼란

자신의 코드는이 때 종료

않는 연결리스트

typedef struct node { 
    int value; 
    struct node *next; 
} ListNode; 

typedef struct list { 
    ListNode *head; 
} LinkedList; 

의 구조체입니다

void deleteList(LinkedList *ll) { 
    if (ll != NULL) { 
     ListNode *temp; 
     while (ll->head) { 
      temp = ll->head; 
      ll->head = temp->next; 
      free(temp); 
     } 
     free(ll); 
    } 
} 

위의 내용을 이해할 수 없습니다. 왜 그가 그런 복잡성을 만들어야하는지, 왜 그냥 자유롭지 않을지 (ll). 도와주세요

미리 감사드립니다.

+1

당신은 'malloc'하나 하나를 '자유롭게'해야합니다. –

+1

연결 목록이 무엇인지 얼마나 잘 알고 있습니까? 여기 또는 짧은 설명이 있습니다. – RobP

+0

각 할당 작업을 취소해야합니다. 목록에 노드를 추가하는 구현을 살펴보십시오. 이는 단서를 제공합니다. – SomeWittyUsername

답변

3

링크 된 목록은 서로를 가리키는 개별 객체로 구성됩니다. 목록을 삭제하려면 모든 노드를 삭제해야합니다. free()하지 않습니다. 이 객체들이 목록을 구성한다는 것을 알지 못합니다. 이 객체가 무엇이든에 대한 포인터를 포함한다는 것을 알지 못합니다. 따라서 목록을 반복하고 각 노드에 직접 free을 입력해야합니다.

+0

감사합니다 !!!! 나는 free()가 포인터를 가지고 모든 노드를 추적하고 그것들 모두를 자유롭게 사용할 것이라고 가정하고 있었다. –

0

각 포인터가 메모리 위치를 가리키기 때문입니다. 이전에 할당 된 모든 메모리 위치를 확보해야합니다. free(ll)ll 포인터가 가리키는 노드 만 제거합니다.

+0

감사합니다 !!!! !!!! –

3

링크 된 목록이있는 경우 모든 "*"가 노드임을 나타냅니다.

 0 1 2 3 4 
head--> *--*--*--*--* 

첫 번째 *, 당신은 그냥 "무료 LL" 이 메모리

 0 1 2 3 4 
head-->nul *--*--*--* 

여기에 문제가있다, 모든 "메모리"에있을 것 할 것입니다, 머리를 말이지 당신을 그 노드가 여전히 존재할 것이냐고 물어 보면 이제는 모든 malloc에 ​​대해 어디에 있는지 알 수 없다. (100 % 사실이 아니고 단순한 일이 필요하다.)

무슨 알고리즘은 할 것은 :

  1. (다음 노드에 대한 참조를 얻을이 작업을 수행하지 않고 노드를 확보 할 경우, 당신은 "다음"노드를 얻을 수 없습니다 머리가 아무 것도 가리키지 않기 때문에).
  2. 무료 머리.
  3. 헤드가 전에 얻은 참조를 가리 킵니다.
+0

고마워요 !!!!!!!!!!!!! –

1

당신은 혼자가 다음과 같은 구조체

typedef struct node { 
    int value; 
    struct node *next; 
} ListNode; 

하지만 전역 변수 struct node *HEAD를 선언 할 때마다 함께 할 수 있습니다. 더 큰 프로그램에서는 혼란 스러울 수 있습니다. 작성자는 변수와 같은 링크 된 목록을 만들 수 있도록이 작업을 수행했습니다.때마다 하나 모두 struct의 개체를 확보해야하고,이 구조체있을 때

LinkedList *ll; 

선언 당신이해야 할 모든이 새로운 링크 된 목록을 만들어야합니다.

+0

감사합니다 !!!! !!!! –

관련 문제