[Sieg]자료구조//링크드 리스트 - 2 - (노드 생성 및 추가)
1편과 이어집니다.
노드 생성
메모리 종류
정적 메모리
전역 변수나 정적 변수 등이 저장되는 곳. 프로그램 종료 시 해제 되는 영역.
자동 메모리
코드 블록 '{}' 이 종료되면 소멸하는 영역. 함수 등.
자유 저장소
프로그래머가 자유롭게 메모리를 할당 및 사용. 안전하게 해제해야할 책임을 가짐.
malloc()
자유 저장소에 메모리를 할당하는 함수. void* malloc(size_t size);
void*은 어떤 자료형도 가리킬 수 있다. 만능.
Node* NewNode = (Node*)malloc(sizeof(Node));
노드 생성 함수 예시
Node* SLL_CreateNode(ElementType NewData)
{
Node* NewNode = (Node*)malloc(sizeof(node));
{
if ((*Head) == NULL) //헤드 노드가 NULL이라면 새로운 노드가 Head가 된다.
NewNode->Data = NewData;
NewNode->NextNode = NULL;
return NewNode;
}
*SLL은 Singly Linked List라는 의미. Double Linked List와 구분하기 위해 명명.
노드 소멸은 free(Node)를 사용한다.
노드 소멸 함수
void SLL_DestroyNode(Node* Node)
{
free(Node);
}
노드 추가
테일 노드 뒤에 새로운 노드를 만들어 연결하는 것
기존 테일 노드의 포인터는 신규 테일노드를 가리키게 하고 신규 테일노드의 포인터는 NULL값을 가진다.
노드추가 함수 예시
void SLL_AppendNode(Node** Head, Node* NewNode)
{
*Head = NewNode;
}
else
{
Node* Tail = (*Head); //테일을 찾아 NewNode를 연결.
while (Tail->NextNode != NULL)
{
Tail = Tail->NextNode;
}
Tail->NextNode = NewNode;
}
}
위와 같이 구현한 Append함수는 리스트를 만들어 사용합니다.
Node* List = NULL;
Node* NewNode = NULL;
NewNode = SLL_CreateNode (117); //자유 저장소에 노드 생성
SLL_AppendNode(&List, NewNode); //생성한 노드 List에 추가
NewNode = SLL_CreateNode(119); //자유 저장소에 또다른 노드 생성
SLL_AppendNode(&List, NewNode); //생성한 노드 List에 추가
Append함수의 매개변수 중 Node**로 선언된 이유
Node*로만 포인터를 지정하면 List포인터가 담고 있는 주소값만 복사된다. 여기서는 LIST변수 자체의 주소가 필요하다.