C언어 연결리스트 1

노드에 대해 알아보자.

<노드 구조채로 생성>

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;
  • 헤드포인터를 NULL 값으로 초깃값 대입
  • 새 노드를 위해서 메모리를 할당하고 주소 값을 헤드 포인터에 저장한다.
  • 노드의 number에 값 12를 저장하고 -> 다음 노드가 없다.

<두번째 노드를 추가 할 땐?>

p_head = (NODE*)malloc(sizeof(NODE));
p_head->p_next->number = 15;
p_head->p_next->p_next = NULL;
  • 두번 쨰 노드 메모리를 할당한다.
  • 노드 number 값에 15를 대입한다.
  • 다음 노드가 없다.

<반복문으로 연결 리스트 마지막 노드를 탐색해보자.>

NODE* p = p_head;
while (NULL != p->p_next)
{
     p = p->p_next;
}
  • p_head에 저장된 주소 값에서 시작하고 첫 노드의 주소 값을 저장한다.
  • p_next가 NULL일 떄 까지 반복한다.

<연결 리스트 함수 구현 >

  • 연결 리스트에 새로운 노드를 추가하고, temp 변수에 넘긴 숫자 값을 새로 추가된 노드의 number에 저장
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; //다음 노드가 없음을 명시한다.

}
  • **pp_tail라는 끝 노드를 추가했다. 마지막 노드를 추가함으로써 while문을 사용하지 않아도 된다는 장점이 생긴다. (효율적이다)

<노드 삭제>

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로 변경한다.

좋은 웹페이지 즐겨찾기