무슨 일로 C 하셨습니까?

[C] 자료구조::연결 리스트 (LINKED LIST) _ 2 본문

C - 이걸 굳이?/유틸리티

[C] 자료구조::연결 리스트 (LINKED LIST) _ 2

OJJJ 2020. 10. 7. 13:34

리스트를 정의하고 맨 뒤에 데이터를 추가하는 함수까지 만들었다

 

추가로 리스트에 필요한 여러함수를 구현하자

 


우선은 데이터가 잘 들어갔는지 확인도 할겸 출력함수 부터 구현하자

void LIST_Show(list head) {
    node* temp = head.body;
    int i = 0;

    printf("--- total count : %d\n", head.count);
    while (temp!=NULL) {
        printf("%d - %s\n", i,temp->data);
        i++; temp = temp->link;
    }
}

코드 로직적으로 복잡할게 없고 에러가 발생할 일도 없으니 간단하게 구현했다.

 


그 다음은 전체 메모리 반환이다. 

메모리를 썼으면 적절하게 반환하는걸 잊지말자

int LIST_Release(list* head) {
    if (head->count == 0 /*head->body ==NULL*/ ) return true;
    node* ptr = head->body;
    node* next = ptr->link;

    while (1) {
        free(ptr);

        if (next == NULL) break;

        ptr = next;
        next = ptr->link;
    }
    head->count = 0;
    head->body = NULL;
    return true;
}

 

메모리 반환 또한 로직적으로 별로 어려울 것이 없다.

 

연결된 모드 리스트에 대해서 하나씩 반환해서 모두 반환시켜주면 되겠다.

 


데이터 삽입 또한 필수적인 함수다

int LIST_Insert(list* head, char* data, int index) {
    if (index > head->count) return false;
    return true;
}

인자로 데이터와 그 데이터가 위치하게될 인덱스를 주도록 한다.

 

물론 데이터가 위치할 인덱스가 리스트의 범위 밖이라면 실패하겠다.

 

    node* ptr = head->body;
    node* pre = NULL;
    for (int i = 0; i < index; i++) {
        pre = ptr;
        ptr = ptr->link;
    }

    if (pre == NULL) {
        pre = (node*)malloc(sizeof(node));
        pre->data = data;
        pre->link = ptr;
        head->body = pre;
    }
    else {
        pre->link = (node*)malloc(sizeof(node));
        pre->link->data = data;
        pre->link->link = ptr;
    }

함수 내 로직은 복잡하지 않다. 저번에 만든 데이터 추가함수와 크게 다르지 않다.

 

원하는 인덱스까지 포인터를 이동시켜준 후 삽입해 주면 되겠다.

 

int LIST_Insert(list* head, char* data, int index) {
    
    if (index > head->count) return false;

    node* ptr = head->body;
    node* pre = NULL;
    for (int i = 0; i < index; i++) {
        pre = ptr;
        ptr = ptr->link;
    }

    if (pre == NULL) {
        pre = (node*)malloc(sizeof(node));
        pre->data = data;
        pre->link = ptr;
        head->body = pre;
    }
    else {
        pre->link = (node*)malloc(sizeof(node));
        pre->link->data = data;
        pre->link->link = ptr;
    }

    head->count++;
    return true;
}

삽입 친구 삭제도 구현해주자

 

int LIST_Delete(list* head, int index) {
    if (index > head->count) return false;
    return true;
}

 

삽입과 마찬가지로 인덱스를 사용하며 인덱스를 벗어나면 에러를 반환시켜준다.

 

int LIST_Delete(list* head, int index) {

    if (index > head->count) return false;

    node* ptr = head->body;
    node* pre = NULL;
    for (int i = 0; i < index; i++) {
        pre = ptr;
        ptr = ptr->link;
    }

    if (pre == NULL) {
        free(ptr);
        head->body = NULL;
    }
    else {
        pre->link = ptr->link;
        free(ptr);
    }

    head->count++;
    return true;
}

삽입과 마찬가지로 인덱스만큼 포인터를 옮겨준 후 

해당 위치에서 노드를 없애준 후 끊어진 리스트를 붙혀주면 되겠다.

 


 

void main() {
    list datalist;
    LIST_Init(&datalist);

    LIST_Add(&datalist, "one");
    LIST_Add(&datalist, "two");
    LIST_Add(&datalist, "three");
    LIST_Add(&datalist, "four");
    
    LIST_Insert(&datalist, "six", 4);
    LIST_Delete(&datalist, 1);

    LIST_Show(datalist);

    LIST_Release(&datalist);
   
}

각 함수가 잘 돌아가는지 테스트 해보자

Comments