노드에 대해 알아보자.
typedef struct node
{
int number; //숫자를 저장하는 변수
struct node* p_next; // 다음 노드를 가르키는 포인터
}NODE;
NODE* p_head = NULL;
p_head = (NODE*)malloc(sizeof(NODE));
p_head->number = 12;
p_head->p_next = NULL;
p_head = (NODE*)malloc(sizeof(NODE));
p_head->p_next->number = 15;
p_head->p_next->p_next = NULL;
NODE* p = p_head;
while (NULL != p->p_next)
{
p = p->p_next;
}
void AddLinkedlist(NODE** pp_head, int temp) //2차원 포인터를 선택한 이유는 p_head 포인터 변수와 주소 값을 넘겨 받아야하고, 1차원 포인터의 주소 값을 받아서 사용해야된다.
{
NODE* p;
if (NULL != *pp_head) // 여기서 *pp_head는 이전에 p_head값과 동일하다.
{
p = *pp_head;
while (NULL != p->p_next) p = p->p_next; // 마지막 노드를 찾기 위해서 p_next가 NULL일 때 까지 반복한다.
p->p_next = (NODE*)malloc(sizeof(NODE)); // 새 노드를 위한 메모리를 할당한다.
p = p->p_next; // 새로 만든 노드의 주소 값을 p에 넣는다.
}
else {
*pp_head = (NODE*)malloc(sizeof(NODE));//새 노드 메모리를 할당한다.
p = *pp_head; // 새로 만든 주소 값을 p에 대입한다.
}
p->number = temp; // 새 노드 number에 temp를 대입한다.
p->p_next = NULL; //다음 노드가 없다
}
void addfuction(NODE** pp_head, NODE** pp_tail, int number)//tail를 이용한 함수
{
//tail를 추가함으로써 while(NULL != *pp_head) x tail이라는 마지막 노드를 설정하고 그것이 p_next를 가리키게 설정한다.
if (NULL != *pp_head)
{
*pp_tail->p_next = (NODE*)malloc(sizeof(NODE));//메모리를 할당해라
*pp_tail = (*pp_tail)->p_next;
}
else
{
*pp_head = (NODE*)malloc(sizeof(NODE));
*pp_tail = (*pp_head);
}
*pp_tail->number = data; // 새 노드의 number에 data값 명시
*pp_tail->p_next = NULL; //다음 노드가 없음을 명시한다.
}
NODE* p = p_head, * p_save;
while (NULL != p)
{
p_save = p->p_next; // p_save에 값을 넣는 역할을 한다.
free(p);
p = p_save;
}
p_head = p_tail = NULL; //시작노드와 끝 노드가 없다는 것을 명시한다.
NODE* p;
while (NULL != p_head)
{
p = p_head->p_next;
free(p);
p_head = p;
}
p_tail = p_head; //반복문을 빠져 나오면 p_head값은 NULL이다. p_tail 값도 NULL로 변경한다.