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
- 메모리반환
- socket
- Android
- vscode
- flutter
- Kotlin
- 문자열파싱
- 문자열 다루기
- InfluxDB
- ws2_32.lib
- UI
- 연결리스트
- dart
- Mat 변수
- vs code
- 진수변환기
- 딕셔너리
- 소켓프로그래밍
- 콘솔 키보드 이벤트
- FTP
- 파일입출력
- background service
- dictionary
- C
- foreground service
- 문자열다루기
- 코틀린
- InfluxDBClient
- 자료구조
- Linked List
Archives
- Today
- Total
무슨 일로 C 하셨습니까?
[C] 자료구조::연결 리스트 (LINKED LIST) _ 2 본문
리스트를 정의하고 맨 뒤에 데이터를 추가하는 함수까지 만들었다
추가로 리스트에 필요한 여러함수를 구현하자
우선은 데이터가 잘 들어갔는지 확인도 할겸 출력함수 부터 구현하자
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);
}
각 함수가 잘 돌아가는지 테스트 해보자
'C - 이걸 굳이? > 유틸리티' 카테고리의 다른 글
[C] 자료구조::딕셔너리 (Dictionary) _ 2 (2) | 2020.10.15 |
---|---|
[C] 자료구조::딕셔너리 (Dictionary) (1) | 2020.10.13 |
[C] 자료구조::연결 리스트 (LINKED LIST) _ 1 (0) | 2020.10.07 |
[C] 문자열 다루기::문자열 치환 + α (0) | 2020.09.28 |
[C] 문자열 다루기::문자열 파싱 (0) | 2020.09.04 |
Comments