이번 시간에는 새로운 노드를 추가하는 과정에 대해 알아보겠습니다. 추가할때는 2가지 경우의 수가 존재합니다. 맨 앞에 추가하거나, 어떤 노드 바로 뒤에 추가하는 경우가 있습니다.
< 맨 앞에 노드 추가하기 >
위와 같이 새로운 노드를 맨 앞에 추가할 경우 첫번째 노드를 가리키는 포인터 head를 보겠습니다. 만약 head가 전역변수일 경우 위 코드와 같이 head = temp 처럼 포인터 변수간에 치환문을 사용하면 됩니다. ( 위 코드의 순서는 필수적으로 지켜져야 합니다. ) 하지만 만약 포인터 head변수가 전연변수가 아니라면 어떻게 될까요 ?
만약 add_frist 함수를 약간 수정해서 인자로 Node *head를 받는다고 생각해봅시다. 가볍게 생각하면 인자로 노드의 주소를 가리키는 head변수를 입력받아 함수 안에서 새로운 노드를 만들고 그 노드를 카리키는 Node *temp를 리턴받아 노드의 name에 Ann을 쓰고, 다음 노드를 가리키는 곳에 head를 쓰고 마지막에 head = temp 치환문을 통해 head가 가리키는 주소값을 변경해주면 될 거 같습니다. 하지만 이 과정에는 큰 문제가 존재합니다.
main 안에서 선언된 head 변수와 add_first에서 선언된 head함수는 전혀 다른 변수이기 때문입니다. 그림을 보면서 생각을 해보면, main문 안에 선언되 head변수는 원래 존재하던 첫번째 노드를 가리키고 있는 상태입니다. 그아중에 add_frist함수가 호출이 되면 그 함수 안에서 head변수를 선언하여 Ann을 가지는 새로운 노드를 만들고 그 head변수가 Ann을 가지는 노드를 가리키게 됩니다. 즉, main안에서의 head는 달라지는게 없습니다.
해결 방법은 있습니다. add_first함수에서 head를 인자로 받을때 head 그자체의 값을 받는것이 아닌 포인터 변수 head의 주소(**head)를 매개변수로 받으면 됩니다. 이렇게 구현할 경우 포인터 변수 head의 주소값을 받으므로 &head로 호출해야 합니다.
또 다른 방법이 있으면 간단하게 생각하면, 새로운 head 노드의 주소를 return 하면 됩니다. 이렇게 되면 add_first의 type이 Node가 아니라 Node*가 됩니다.
< 노드 사이에 삽입하기 >
이 과정에서도 순서는 절대적으로 지켜져야 합니다. 첫번째로 새로운 노드를 만들고 데이터를 저장한 후 새로운 노드의 next 필드가 prev의 다음 노드를 가리키도록 하고 마지막으로 새로운 노드를 perev의 다음 노드로 만듭니다.
Node *tmp = (Node *)malloc(sizeof(Node));
tmp->data = data_to_store;
tmp->next = prev->next;
prev->next = tmp;
'Language > 자료구조' 카테고리의 다른 글
[13] C review < 연결리스트의 순회 > (0) | 2021.11.26 |
---|---|
[12] C review < 연결리스트의 제거 > (0) | 2021.11.26 |
[10] C review < 연결리스트의 개념 > (0) | 2021.11.25 |
[8] C review < 전화번호부 알고리즘 version5.0 preview > (0) | 2021.11.25 |
[7] C review < 전화번호부 알고리즘 version4.0 > (0) | 2021.11.23 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!