JUNGLE 240410 (W03)
KRAFTON JUNGLE Week 03
1. Keywords
Linked List
Node 구조체 정의 및 초기화
// 링크드 리스트의 노드 구조체 정의
typedef struct listNode
{
struct listNode *next; // 다음 노드를 가리키는 포인터
int data; // 노드가 저장하는 데이터
}listNode;
// 링크드 리스트 초기화 함수
listNode *init_list(void)
{
listNode *head;
head = (listNode *)malloc(sizeof(listNode));
head->next = NULL; // 헤드 노드의 다음 노드는 없음
return (head);
}
마지막 Node 찾기 & 전체 Node 개수 세기
// 링크드 리스트의 마지막 노드를 찾는 함수
listNode *find_end(listNode *h)
{
listNode *cur;
cur = h;
// 리스트의 끝까지 순회
while (cur->next != NULL)
{
cur = cur -> next;
}
return (cur);
}
// 링크드 리스트의 노드 개수를 세는 함수
int node_len(listNode *h)
{
int cnt;
listNode *cur;
cur = h;
cnt = 0;
// 리스트의 끝까지 순회하면서 개수를 센다.
while (cur->next != NULL)
{
cnt++;
cur = cur->next;
}
return (cnt);
}
Node 검색
// 인덱스로 노드를 찾는 함수
listNode *read_node_idx(listNode *h, int num)
{
int i;
listNode *cur;
cur = h;
i = 0;
// 잘못된 인덱스 예외 처리
if (num < 1 || num > node_len(h))
{
printf("wrong data\n");
return (h);
}
// 해당 인덱스의 노드까지 이동
while (i < num)
{
cur = cur -> next;
i++;
}
return (cur);
}
// 데이터로 노드를 찾는 함수
listNode *read_node_data(listNode *h, int data)
{
listNode *cur;
cur = h;
// 리스트를 순회하면서 데이터를 비교
while (cur -> data != data && cur -> next != NULL)
{
cur = cur -> next;
}
// 데이터를 찾지 못한 경우 예외 처리
if (cur -> next == NULL)
{
printf("wrong data\n");
return (h);
}
return (cur);
}
Node 삽입
// 맨 앞에 노드를 삽입하는 함수
void add_first_node(listNode *h, int data)
{
listNode *newNode;
newNode = (listNode *) malloc(sizeof(listNode));
newNode -> data = data;
newNode -> next = h -> next;
h -> next = newNode;
}
// 맨 뒤에 노드를 삽입하는 함수
void add_last_node(listNode *h, int data)
{
listNode *end;
end = find_end(h);
listNode *newNode;
newNode = (listNode *) malloc(sizeof(listNode));
newNode -> data = data;
end -> next = newNode;
newNode -> next = NULL;
}
// 중간에 노드를 삽입하는 함수
void insert_node(listNode *h, int n, int data)
{
if (n == 1)
add_first_node(h, data);
else if (n == node_len(h))
add_last_node(h, data);
else if (n < 1 && n > node_len(h))
{
printf("wrong range\n");
return ;
}
else
{
int i;
listNode *prev;
prev = h;
i = 0;
while (i < n - 1)
{
prev = prev -> next;
i++;
}
listNode *newNode;
newNode = (listNode *) malloc(sizeof(listNode));
newNode -> data = data;
newNode -> next = prev -> next;
prev -> next = newNode;
}
}
Node 수정
// 노드의 데이터를 수정하는 함수
void edit_node(listNode *h, int search, int modify)
{
listNode *s;
s = read_node_idx(h, search);
if(s == h)
{
return ;
}
s -> data = modify;
}
Node 삭제
// 첫번째 노드를 삭제하는 함수
void delete_first_node(listNode *h)
{
listNode *cur;
cur = h -> next;
h -> next = cur -> next;
cur -> next = NULL;
free(cur);
}
// 노드를 삭제하는 함수
void delete_node(listNode *h, int n)
{
if (n == 1)
delete_first_node(h);
else if (n < 1 && n > node_len(h))
{
printf("wrong range\n");
return;
}
else
{
int i;
listNode *prev;
prev = h;
i = 0;
while (i < n - 1)
{
prev = prev -> next;
i++;
}
listNode *cur;
cur = prev -> next;
prev -> next = cur -> next;
cur -> next = NULL;
free(cur);
}
}
// 모든 노드를 삭제하는 함수
void delete_all_node(listNode *h)
{
listNode *cur;
cur = h;
listNode *nxt;
while(cur != NULL)
{
nxt = cur -> next;
free(cur);
cur = nxt;
}
// free(h);
}
free(h)
: NULL 데이터를 해제하려고 해서 오류 남 -> 주석 처리
Node 출력
// 전체 노드를 출력하는 함수
void print_all_node(listNode *h)
{
listNode *cur;
cur = h -> next;
if (cur != NULL)
{
while (1)
{
printf("%d", cur -> data);
if (cur -> next == NULL)
{
printf("\n");
break;
}
else
printf("->");
cur = cur -> next;
}
}
else
{
printf("No data\n");
}
}
포인터 (Pointer)
- 변수의 메모리 주소를 저장하는 변수
- 다른 변수의 위치를 가리키고 해당 위치의 값을 읽거나 변경 가능
- 포인터는 메모리의 어떤 위치든지 가리킬 수 있음
- 포인터 변수는 선언 시에 데이터 타입을 지정하여 해당 타입의 변수를 가리키게 됨
*
연산자
- 포인터가 가리키는 메모리 위치의 값에 접근하는데 사용
- ex.
*ptr
은 포인터ptr
이 가리키는 위치의 값
&
연산자
- 변수의 주소를 구하는 데 사용
- ex.
&var
은 변수var
의 주소를 나타냄