다음과 같은 단순 연결리스트 코드가 있다.
#include <stdio.h>
#include <stdlib.h> // malloc, free 함수가 선언된 헤더 파일
struct NODE { // 연결 리스트의 노드 구조체
struct NODE *next; // 다음 노드의 주소를 저장할 포인터
int data; // 데이터를 저장할 멤버
};
int main()
{
struct NODE *head = malloc(sizeof(struct NODE)); // 머리 노드 생성
// 머리 노드는 데이터를 저장하지 않음
struct NODE *node1 = malloc(sizeof(struct NODE)); // 첫 번째 노드 생성
head->next = node1; // 머리 노드 다음은 첫 번째 노드
node1->data = 10; // 첫 번째 노드에 10 저장
struct NODE *node2 = malloc(sizeof(struct NODE)); // 두 번째 노드 생성
node1->next = node2; // 첫 번째 노드 다음은 두 번째 노드
node2->data = 20; // 두 번째 노드에 20 저장
node2->next = NULL; // 두 번째 노드 다음은 노드가 없음(NULL)
struct NODE *curr = head->next; // 연결 리스트 순회용 포인터에 첫 번째 노드의 주소 저장
while (curr != NULL) // 포인터가 NULL이 아닐 때 계속 반복
{
printf("%d\n", curr->data); // 현재 노드의 데이터 출력
curr = curr->next; // 포인터에 다음 노드의 주소 저장
}
free(node2); // 노드 메모리 해제
free(node1); // 노드 메모리 해제
free(head); // 머리 노드 메모리 해제
return 0;
}
C
복사
나의 궁금점..!
도대체 왜..! node 마다 malloc을 해줘야 하는거지..?
#include <stdio.h>
#include <stdlib.h>
struct NODE {
struct NODE *next;
int data;
};
int main()
{
struct NODE head;
struct NODE node1;
head.next = &node1;
node1.data = 1;
struct NODE node2;
node1.next = &node2;
node2.data = 2;
node2.next = NULL;
struct NODE *curr = head.next;
while (curr != NULL)
{
printf("%d\n", curr->data);
curr = curr->next;
}
return (0);
}
C
복사
이런식으로 해줘도 되는 거 아닌가..!
스스로 생각해본 결과..!
딱 저 상황에서만 보았을때는 문제가 없다.
node1 node2 를 순회하면서 1,2 값을 잘 찍는다.
그렇다면 왜 동적할당을 해주는 것일까?
내가 내린 결론은..새로운 노드를 삽입할때에 그 문제가 나타난다.
우리는 새로운 노드 삽입을 위해서 삽입 함수를 만들게 될 것인데, 새로운 노드를 삽입을 할때에는 기본적으로 새로운 노드를 할당 받아야한다. 즉, 그냥 일반 변수를 사용하게 되면 삽입 함수가 종료 시에 그 변수는 소멸되기 떄문에 새로운 노드가 사라지는 반면, 동적할당을 통해서 주소를 할당 받게 되면 그 함수가 끝이 나더라도 새로운 노드의 주소는 계속 남게 된다.