Search
Duplicate
🖇️

연결리스트에서 동적할당 해주는 이유

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
자료구조
Scrap
태그
연결리스트
구조체
동적할당
9 more properties
다음과 같은 단순 연결리스트 코드가 있다.
#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 값을 잘 찍는다.
그렇다면 왜 동적할당을 해주는 것일까?
내가 내린 결론은..새로운 노드를 삽입할때에 그 문제가 나타난다.
우리는 새로운 노드 삽입을 위해서 삽입 함수를 만들게 될 것인데, 새로운 노드를 삽입을 할때에는 기본적으로 새로운 노드를 할당 받아야한다. 즉, 그냥 일반 변수를 사용하게 되면 삽입 함수가 종료 시에 그 변수는 소멸되기 떄문에 새로운 노드가 사라지는 반면, 동적할당을 통해서 주소를 할당 받게 되면 그 함수가 끝이 나더라도 새로운 노드의 주소는 계속 남게 된다.