2014-01-27 2 views
1

의 링크 된 목록에있는 동안 C의 링크 된 목록을 연구하는 동안 헤드 노드의 두 가지 구현이 나왔습니다. 다음은 사용 된 구조 인 경우라고 :헤드 노드가 C

헤드 노드는 그것의 실제 데이터가 단지 더미 노드 있지만 다른 노드 (제 실제 노드에 바로 링크이다
struct node 
{ 
int data; 
struct node *next; 
} 

은 첫 번째 구현은 이런 데이터)로 :

struct node *head; 
head->next = NULL; //head->next would then be linked to the first node. 

제 implementaton 머리 노드가 공간을 할당 malloc에 ​​명령을 사용하여 저장되고 그것의 데이터와 상기 제 실제 노드가 하나있다.

내 질문에, 우리는 어떻게 머리 부분에 malloc을 사용하여 할당 된 공간이 없다는 첫 번째 구현에서 "head-> next"를 사용할 수 있습니까? 왜냐하면 내가 아는 한 (틀렸다면 나를 바로 잡기 때문에) 노드의 두 필드는 공간이 해당 노드에 할당 된 후에 만 ​​사용할 수 있기 때문입니다.

struct node *head = malloc(sizeof (struct node)); 
if (!head) { perror("malloc node"); exit(EXIT_FAILURE); }; 
head->next = NULL; 
// initialize other fields of head 

head의 모든 필드를 초기화하는 것을 잊지 마십시오

+0

더 많은 소스 코드보기. 귀하의 질문은 혼란 스럽습니다. 'node.js'와의 관계는 무엇입니까? –

답변

1

당신은 C dynamic memory allocation 누락! 읽기 malloc(3)

첫 번째 포인터를 포함하는 글로벌 변수 full_list을 가질 수 있습니다.

if (!full_list) 
    full_list = head; 

linked list 위키 페이지를 읽고 ... 또한 this 참조하십시오.

3

동적으로 메모리를 할당 할 때만 Malloc이 필요합니다. 메소드 안에 struct node head과 같은 것을 쓰면 헤드 노드가 스택에 할당되어 거기에서 살고 죽을 것이다. 따라서이 노드에 데이터를 쓸 수는 있지만 일단 메소드가 끝나면 죽을 것입니다.

또는 머리를 전역 적으로 정의 할 수 있습니다.이 경우 정적으로 할당되고 프로그램이 종료 될 때까지 영원히 살게됩니다. Malloc은 함수가 종료 된 후에 살 수있는 메모리 조각을 만들 때만 필요합니다. 포인터에서 free으로 전화 할 때만 지워집니다.

+0

올바르지 않습니다. 여러분이 좋아하는 곳에'struct node * head'라고 쓸 수 있습니다. 그리고 그것은 여전히 ​​헤드 노드를 할당하지 않을 것이고, 노드가 아니라 포인터를 할당 할 것입니다. 반면에'struct node head'라고 쓰면 자동 저장을 사용하여 노드를 할당합니다. ("스택에".) –

+0

당신 말이 맞아, 그게 내가 의미했던 것이지만 나는 두뇌 방구 방울을 가지고 그것을 포인터로 만든 것 같아요. 결정된. – George

1

머리를 초기화하지 않은 경우 헤드가 다음 노드를 가리 키지 않으므로 헤드를 초기화해야하므로 두 번째 구현이 만장일치로 사용되는 이유는 무엇입니까? 첫 번째 방법을 사용하는 경우 아직 초기화해야하며 초기화하는 경우에도 데이터 변수를 사용해야합니다.