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로 변경한다.
Author And Source
이 문제에 관하여(C언어 연결리스트 1), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@qlwb7187/C언어-연결리스트저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)