원형 연결리스트(4)
초기화함수는 간단하게 살펴봤고, 다음으로 노드를 꼬리에 추가하는 함수와, 노드를 머리에 추가하는 함수에 대해 알아보겠다.
더미가 없기 때문에, 첫번째 노드 생성과 두번째부터의 노드 생성에 차이가 생긴다는걸 알 수 있다.
첫 노드는 머리이자 꼬리가 됨. 즉 자기 자신을 가리키게 된다.(꼬리는 머리를 가리키기 때문)
따라서 LInsert와 LInsertFront()는 다음의 공통적인 내용을 갖는다.
void LInsert(List* plist, Data data)
{
Node* tempL = (Node*)malloc(sizeof(Node));
tempL->data = data;
if (plist->tail = NULL)
{
plist->tail = tempL;
tempL->next = tempL;
}
(plist->numOfData)++;
}
이후 머리에 추가하는 걸 먼저 생각해보자.
void LInsertFront(List* plist, Data data)
{
Node* tempL = (Node*)malloc(sizeof(Node));
tempL->data = data;
if (plist->tail = NULL)
{
plist->tail = tempL;
tempL->next = tempL;
}
else
{
tempL->next = **plist->tail->next;**
plist->tail->next = tempL;
}
(plist->numOfData)++;
}
이부분이 중요하다. 그림을 보면,
data7을 담고 있는 노드를 data4를 담고 있는 노드에 어떻게 추가할 것인가가 관건인데, 이전시행에서 4는 tail→next이다. 이를 이용해서 새로운 노드를 계속 이어 붙인다.
참고로 여기서 tail의 의미가 조금 바뀐다.
tail의 의미는 마지막으로 추가된 node가 아니라, 상대적인 기준으로 고정된, 그리고 head를 가리키는 node이다.(따라서 의미상 tail→next는 항상 상대적 기준에서의 head이다.)
그리고 head가 가장 마지막으로 추가된 node라는 의미를 갖는다.(유동적임)