Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- vs code
- Android
- InfluxDBClient
- Kotlin
- background service
- 문자열 다루기
- InfluxDB
- UI
- socket
- 진수변환기
- 문자열다루기
- 코틀린
- flutter
- 딕셔너리
- 소켓프로그래밍
- 콘솔 키보드 이벤트
- FTP
- ws2_32.lib
- dart
- foreground service
- 자료구조
- Mat 변수
- Linked List
- 파일입출력
- 연결리스트
- C
- vscode
- 문자열파싱
- dictionary
- 메모리반환
Archives
- Today
- Total
무슨 일로 C 하셨습니까?
[C] 자료구조::딕셔너리 (Dictionary) _ 2 본문
추가로 필요한 함수를 더 만들어보자
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) 때문에
추후 수정이 필요할 것 같다.
'C - 이걸 굳이? > 유틸리티' 카테고리의 다른 글
[C] 문자열 다루기::문자열 복사 (0) | 2021.01.22 |
---|---|
[C] 메모리 반환 (0) | 2020.10.15 |
[C] 자료구조::딕셔너리 (Dictionary) (1) | 2020.10.13 |
[C] 자료구조::연결 리스트 (LINKED LIST) _ 2 (0) | 2020.10.07 |
[C] 자료구조::연결 리스트 (LINKED LIST) _ 1 (0) | 2020.10.07 |
Comments