[C]LinkedList_구현

반응형

중요 부분

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