자기 참조 구조체란, 자기 구조체와 같은 형을 point 하는 필드가 있는 구조체를 말해요. 왜 갑자기 자료구조가 안 나오고, 이것이 먼저 나왔을까요? 이것을 이해해야 List를 이해할 수 있기 때문이에요.

 

 

 코드를 봅시다. 보시면 struct node 안에, struct node를 가리키는 포인터가 있음을 알 수 있어요. 그렇다면, node 안의 어떠한 필드가 또 다른 node를 가리킬 수 있다는 것을 의미합니다.

 

 

 이런 식으로 말입니다. 이게 single로 이어져 있으면 모르겠지만, double로 이어져 있다면, 삭제할 위치라던지, 삽입할 위치만 알고 있다면, 삽입과 삭제하는 연산을 금방 할 수 있기 때문에, List를 쓰고요. C언어에서 List를 구현하기 위해서 자기 참조 구조체를 쓰는 셈입니다.

 

 


 "수서", "복정"만 추가해 봅시다. 처음에 head와 tail 값은 null 값입니다.

 

 

 일단 _new가 새로 생성되는데요. 새로 생성이 되면, 전체를 0으로 초기화 해 주고, _new->str에 tar를 복사해 주는 역할을 합니다. 즉 make_node("수서"); 라면, 새롭게 추가된 node에 "수서" 라는 데이터를 넣는 겁니다. SRT까지 개통되면서 사람들이 꽤 많이 찾는 역이죠.

 

 

 

 _new는 "수서"가 있는 노드를 가리킵니다. 그런데 head와 tail이 null입니다. 그러면 28번째 else문에 걸려서 30번째 문장을 수행할 거에요. head와 tail에 _new의 값을 넣으라는 건데, 이것은 head와 tail이 맨 처음 원소를 가리키게 하라는 말입니다.

 

 

 다음에 "복정"을 추가할 거에요. 어떻게 하면 좋을까요? 일단 _new는 "복정"을 가리키고 있어요.

 

 

 그런데 head와 tail이 NULL이 아니기 때문에, 23번째 if문에 걸려요. 이 때에는 어떻게 될까요?

 

 

 tail의 next에다가 _new의 주솟값을 넣어요. 그러면 tail의 next 맴버는 "복정"을 가리킬 거에요.

 

 

 다음에, 26번째 줄에 의해서 tail 값에 _new가 들어갑니다. _new는 "복정"의 주솟값입니다. tail에 이 값이 들어간다는 것은, tail 또한 "복정" 이라는 것을 가리킨다는 이야기가 되겠습니다.

 

 

 이 상태에서, search()를 해 봅시다. 보시면, node의 맴버가 또 다른 node를 가리키고 있어요.

 


 순회는 쉬우니까, 여기서 언급하도록 하겠습니다.

 

 

 head는 첫 번째 원소를 가리킵니다. 따라서, 첫 번째 원소를 출력하기 위해서, head->str을 해 주면 됩니다. 그 다음 원소는 어떻게 가면 좋을까요? head의 next가 첫 번째 원소의 다음 원소를 가리키고 있어요.

 

 

 그 다음에, head->next를 보면 됩니다. 그러면 현재 보고 있는 노드는 head->next가 됩니다. "복정"까지 봤습니다. 노드가 더 있나요? 없습니다. 현재 보고 있는 노드의 next 맴버가 null 값을 가지기 때문에 빠져 나오면 됩니다.

 

 

 이것을 코드로 간단하게 보면 다음과 같습니다. 35번째 줄에서, 처음에 탐색을 시작할 위치를 head로 잡았습니다. 그리고, 36번째 줄에 cur = cur->next 부분은, 다음 원소로 이동하는 문장입니다. cur->next는, cur 다음의 원소를 가리키고 있기 때문입니다.

 

 그 값이 NULL이라면, 빠져나오면 됩니다. 예제가 조금 어려우시다면, 천천히 그려보시면서 이해하시면 좋을 듯 싶습니다. node의 어떤 맴버가 node를 가리킨다. 이것이 자기 참조 구조체에요. 물론, List를 동적 할당해서 만드는 게 아니라, 정적으로 array를 만들어 놓고, 다음 원소는 배열의 몇 번째 위치에 있는지 저장하는 식으로도 쓸 수 있습니다. 그것은 추후에 다시 이야기를 해 드리도록 하겠습니다.