무슨 일로 C 하셨습니까?

[C] 자료구조::딕셔너리 (Dictionary) _ 2 본문

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

[C] 자료구조::딕셔너리 (Dictionary) _ 2

OJJJ 2020. 10. 15. 16:09

추가로 필요한 함수를 더 만들어보자

 


int DICTIONARY_Delete(dictionary* head, char* key) {

    _dictionary* ptr = head->head;
    _dictionary* pre = NULL;
    

    while (true) {
        if (ptr == NULL) return false;
        else if (StringCompare(ptr->key, key) == COMPARE_SAME) break;
 
        pre = ptr;
        ptr = ptr->link;
    }

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

 

삭제 함수는 연결 리스트와 다르지 다른 것이 거의 없다. 

 

다만 변수 value가 힙 영역에 할당된 메모리를 참조하고 있다면 메모리를 반환시켜줘야 하는데

 

이 점에 대해서 추가적인 연구가 필요할 것 같다.


void* DICTIONARY_Search(dictionary head, char* key) {
    _dictionary* temp = head.head;
    while (1) {
        if (temp == NULL) return NULL;

        if (StringCompare(temp->key, key) == COMPARE_SAME) return temp->value;
        
        temp = temp->link;

    }
}

딕셔너리 자료형의 꽃. 탐색 함수다.

 

key 값을 매개변수로 받아 동일한 key와 매칭 되는 데이터를 반환해주면 되겠다.

 

로직적으로 복잡한 것은 없다.


void main() {
    list datalist;
    LIST_Init(&datalist);
    LIST_Add(&datalist, "one");
    LIST_Add(&datalist, "two");
    LIST_Add(&datalist, "three");
    LIST_Add(&datalist, "four");

    //LIST_Show(datalist);


    dictionary dic;
    DICTIONARY_Init(&dic);

    DICTIONARY_Add(&dic, "key1", "value2");
    DICTIONARY_Add(&dic, "key2", "value1");
    DICTIONARY_Add(&dic, "key2", "value5");

    DICTIONARY_Delete(&dic, "key2");
    DICTIONARY_Add(&dic, "key2", "value7");
    DICTIONARY_Add(&dic, "list", (void*)&datalist);


    DICTIONARY_Show(dic);

    char* a = (char*)DICTIONARY_Search(dic, "key1");
    printf("key1 data is : %s\n", a);
    printf("key2 data is : -\n");
    list templist = *(list*)DICTIONARY_Search(dic, "list");
    LIST_Show(templist);
}

다음과 같이 사용해봄으로 테스트해 볼 수 있다.

 

value 변수의 자료형을 void형 포인터를 사용했기 때문에 문자열이나 구조체 배열 등 다양한 자료형을 담을 수 있다.

 

 

이전에 만든 리스트도 넣을 수 있다.

더보기

2020/10/07 - [C -이걸 굳이?] - [C] 자료구조::연결 리스트 (LINKED LIST) _ 1

2020/10/07 - [C -이걸 굳이?] - [C] 자료구조::연결 리스트 (LINKED LIST) _ 2

 

 

다만 메모리 관리적으로 봤을 때나 참조 방식 (call of value / call of reference) 때문에

 

추후 수정이 필요할 것 같다.

Comments