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
- ws2_32.lib
- InfluxDBClient
- Mat 변수
- 메모리반환
- Android
- 콘솔 키보드 이벤트
- UI
- 자료구조
- FTP
- 문자열파싱
- foreground service
- 진수변환기
- InfluxDB
- 문자열다루기
- 코틀린
- flutter
- socket
- Linked List
- 딕셔너리
- background service
- dart
- 연결리스트
- 문자열 다루기
- Kotlin
- vscode
- dictionary
- C
Archives
- Today
- Total
무슨 일로 C 하셨습니까?
[C] 자료구조::연결 리스트 (LINKED LIST) _ 1 본문
C하면 자료구조.
자료구조하면 리스트가 아니겠는가
사실상 큐나 스택 트리 그래프 모두 리스트가 베이스라고 생각된다.
고로 리스트를 구현해보자
우선 구조체를 만들어보자
typedef struct NODE{
char* data;
struct NODE* link;
}node;
typedef struct LIST{
int count;
struct NODE* body;
}list;
이름들은 아주 직관적으로 짓겠다.
NODE (body) |
data | 실제 데이터가 저장되는 변수 |
link | 다음 리스트를 가르키는 포인터 | |
LIST (head) |
count | 리스트의 전체 크기 |
body | 실제 리스트를 가르키는 포인터 |
구조체를 두개로 구현하여 멋을 가미시켜주자
리스트에 저장될 데이터는 숫자일수도 있고 문자일수도 있고 모르는 일이나
일단은 문자열을 주로 하겠다.
( 추후에 아주 요긴하게 사용할 것이다. )
void LIST_Init(list* head) {
head->count = 0;
head->head = NULL;
}
* 초기화 함수
#define true 1
#define false 0
int LIST_Add(list* head, char* data) {
return false;
}
리스트에 데이터 추가함수다
성공/실패 여부를 반환해 주도록 하자
파라미터로 2차원 포인터를 넘겨주어 메모리가 지역에서 할당되지 않도록 해주자
node* temp = head->body;
while (1) {
// 헤더가 비었을 때
if (temp == NULL) {
temp = (node*)malloc(sizeof(node));
temp->link = NULL;
head->body = temp;
break;
}
// 헤더(현재 노드)가 마지막 일때
else if (temp->link == NULL) {
temp->link = (node*)malloc(sizeof(node));
temp->link->link = NULL;
break;
}
// 다음 노드가 존재할 때
else {
temp = temp->link;
}
}
head->count++;
return true;
리스트를 구현할 때 다음과 같이
헤더가 비었을 때, 마지막 노드일 때, 중간 노드일 때
세가지 경우에 맞춰서 구현하면 되겠다
data만 적절하게 연결시켜주면 된다.
int LIST_Add(list* head, char* data) {
node* temp = head->body;
while (1) {
// 헤더가 비었을 때
if (temp == NULL) {
temp = (node*)malloc(sizeof(node));
temp->data = data;
temp->link = NULL;
head->body = temp;
break;
}
// 헤더(현재 노드)가 마지막 일때
else if (temp->link == NULL) {
temp->link = (node*)malloc(sizeof(node));
temp->link->data = data;
temp->link->link = NULL;
break;
}
// 다음 노드가 존재할 때
else {
temp = temp->link;
}
}
head->count++;
return true;
}
막상 구현해보니 반환이 false 경우가 존재하나 싶다.
void main() {
list datalist;
LIST_Init(&datalist);
LIST_Add(&datalist, "one");
LIST_Add(&datalist, "two");
LIST_Add(&datalist, "three");
LIST_Add(&datalist, "four");
}
함수는 다음과 같이 쓰면 되겠다.
동적할당을 한 메모리를 반환하는 것과
리스트를 출력하는 함수는 다음에 만들도록 하자
'C - 이걸 굳이? > 유틸리티' 카테고리의 다른 글
[C] 자료구조::딕셔너리 (Dictionary) (1) | 2020.10.13 |
---|---|
[C] 자료구조::연결 리스트 (LINKED LIST) _ 2 (0) | 2020.10.07 |
[C] 문자열 다루기::문자열 치환 + α (0) | 2020.09.28 |
[C] 문자열 다루기::문자열 파싱 (0) | 2020.09.04 |
[C] 문자열 다루기::문자열 검색 (0) | 2020.09.04 |
Comments