중요 부분
1. Struct Node 선언(?)
- 참고로 typedef 를 사용하면 편하게 불러올 수 있다.
typedef struct NODE { // 노드 선언
struct NODE *next; // 자식 노드 선언
int data; // data 변수
}NODE;
2. 노드 생성 함수
void appendFirst(NODE *target, int newData){ // 첫 번째 노드 생성
NODE *newNode = malloc(sizeof(NODE)); // 첫 노드의 동적메모리 할당
newNode -> next = target -> next; // 헤더 노드의 포인터를 새노드의 포인터로 연결
newNode -> data = newData; // 인자로 받은 데이터를 새노드의 데이터로 할당
target -> next = newNode; // 해더의 포인터를 새로운 노드로 연결
}
3. 노드 leftpop 함수
int popleft(NODE *target){
NODE *curr = target; // 헤더의 포인터를 저장한 임시 포인터
NODE *temp = curr -> next; // 헤더가 가르키고 있는 포인터의 포인터를 저장할 포인터
int tempData = temp -> data; // 데이터 출력용 변수
curr ->next = temp -> next; // 헤더의 포인터가 가르키고 있는 노드의 포인터를 헤더 포인터에 저장
free(temp); // 헤더 다음 노드 데이터 모두 리셋
return tempData;
}
전체 코드(C)
#include <stdio.h>
#include <stdlib.h>
typedef struct NODE { // 노드 선언
struct NODE *next; // 자식 노드 선언
int data; // data 변수
}NODE;
int popleft(NODE *target){
NODE *curr = target; // 헤더의 포인터를 저장한 임시 포인터
NODE *temp = curr -> next; // 헤더가 가르키고 있는 포인터의 포인터를 저장할 포인터
int tempData = temp -> data; // 데이터 출력용 변수
curr ->next = temp -> next; // 헤더의 포인터가 가르키고 있는 노드의 포인터를 헤더 포인터에 저장
free(temp); // 헤더 다음 노드 데이터 모두 리셋
return tempData;
}
int pop(NODE *headNode){
NODE *curr = headNode; // 헤더의 포인터를 두 임시노드 포인터에 할당
NODE *temp = headNode;
while (curr->next != NULL){ // 이 반복문이 종료되면 temp -> curr -> NULL 로 된다.
temp = curr;
curr = curr -> next;
}
int tempData = curr -> data;
temp -> next = NULL; // temp의 포인터를 끝으로 옮김
free(curr); // curr 삭제
return tempData;
}
void appendFirst(NODE *target, int newData){ // 첫 번째 노드 생성
NODE *newNode = malloc(sizeof(NODE)); // 첫 노드의 동적메모리 할당
newNode -> next = target -> next; // 헤더 노드의 포인터를 새노드의 포인터로 연결
newNode -> data = newData; // 인자로 받은 데이터를 새노드의 데이터로 할당
target -> next = newNode; // 해더의 포인터를 새로운 노드로 연결
}
void append(NODE *target, int newData){ // 반복문으로 받는 데이터들을 append 해줌
if (target -> next == NULL){ // 노드가 없을때
NODE *newNode = malloc(sizeof(NODE));
newNode -> data = newData;
newNode -> next = target -> next;
target -> next = newNode;
}else{ // 노드가 있을때
NODE *curr = target; // 헤더를 curr라는 노드 포인터에 할당
while (curr -> next != NULL){ // 따라서 헤더의 포인터가 가르키는 포인터가 NULL일때까지 반복
curr = curr -> next; // curr의 포인터를 계속 옮겨줌
}
NODE *newNode = malloc(sizeof(NODE)); // 포인터를 옮겨 주고 새로운 동적 메모리 할당
newNode -> data = newData;
newNode -> next = NULL;
curr -> next = newNode; // curr의 포인터를 새로운 노드에 연결
}
}
int main(){
int num01, num02, num03, num04, num05, i; //입력 받을을때 사용할 변수
NODE *head = malloc(sizeof(NODE)); // 포인터로 사용할 헤더 노드 할당
head -> next = NULL; // 포인터는 NULL
printf("입력값: ");
scanf("%d%d%d%d%d", &num01, &num02, &num03, &num04, &num05); // 정수 5개를 입력 받아 arr에 저장
int* arr[] = {&num01, &num02, &num03, &num04, &num05};
printf("--------------------\n"); // 입력받은 값과 출력값을 구분하기위한 구분선
appendFirst(head, *arr[0]); // 첫번째 노드 생성함수
for(i = 1; i <= 4; i++){ // 추가 노드 생성(입력받은 순서대로)
printf("'%d'을 append 했어요\n", *arr[i]);
append(head, *arr[i]); // append 함수 실행
}
int pop_l = popleft(head); // popleft
printf("'%d'를 popLeft 했어요\n", pop_l);
int pop_r = pop(head); // pop
printf("'%d'를 pop 했어요\n", pop_r);
NODE *temp = head -> next;
while (temp != NULL){
printf("%d \n", temp -> data); // 리스트 순회 하면서 출력
printf("|\n");
temp = temp -> next;
}
printf("leaf\n");
temp = head -> next;
while (temp !=NULL){ // 모든 포인터 free
NODE *next = temp -> next;
free(temp);
temp = next;
}
return 0;
}
출력 내용
입력값: 1 2 3 4 5
--------------------
'2'을 append 했어요
'3'을 append 했어요
'4'을 append 했어요
'5'을 append 했어요
'1'를 popLeft 했어요
'5'를 pop 했어요
2
|
3
|
4
|
leaf
배운점, 공부할점
1. 포인터의 사용
- 아직 완전히 이해됬다고 말 할 수 없으나, 사용방법에 대해서는 많이 이해 한 것 같다.
- BinarySearchTree 공부를 하면서 함수도 포인터로 사용하는 것을 배웠다. 이부분은 좀더 공부가 필요하다.
2. 포인터 이동
- 포인터를 이동하는 부분에 대해서는 이제 많이 이해한 것 같다.
3. 함수 활용
- 코드를 작성하면서 함수를 만들어 활용한다는 개념이 많이 받아들여 지는 것 같다.
- 지금 하고 있는 python 알고리즘 공부에도 최대한 활용 해보도록 해야겠다.
반응형
'Develop > C' 카테고리의 다른 글
[C]이분탐색리스트(BinarySearchTree)_구현 (0) | 2022.10.27 |
---|