원형 연결리스트(4)

05-1. 원형 리스트(Linked List)3 ④

초기화함수는 간단하게 살펴봤고, 다음으로 노드를 꼬리에 추가하는 함수와, 노드를 머리에 추가하는 함수에 대해 알아보겠다.

더미가 없기 때문에, 첫번째 노드 생성과 두번째부터의 노드 생성에 차이가 생긴다는걸 알 수 있다.

첫 노드는 머리이자 꼬리가 됨. 즉 자기 자신을 가리키게 된다.(꼬리는 머리를 가리키기 때문)

따라서 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)++;
}

이부분이 중요하다. 그림을 보면,

Untitled

data7을 담고 있는 노드를 data4를 담고 있는 노드에 어떻게 추가할 것인가가 관건인데, 이전시행에서 4는 tail→next이다. 이를 이용해서 새로운 노드를 계속 이어 붙인다.

참고로 여기서 tail의 의미가 조금 바뀐다.

tail의 의미는 마지막으로 추가된 node가 아니라, 상대적인 기준으로 고정된, 그리고 head를 가리키는 node이다.(따라서 의미상 tail→next는 항상 상대적 기준에서의 head이다.)

그리고 head가 가장 마지막으로 추가된 node라는 의미를 갖는다.(유동적임)