2019.01.05.
추상자료형(Abstract Data Type)이란 어떠한 기능이 무엇인가를 나타내는것이다
내가 이해한 바로는 어떤 기능을 수행하는데 필요한 함수들을 나타내는것 같다.
자료구조 리스트는 두가지로 나뉜다.
- 순차 리스트: 배열을 기반으로 구현된 리스트
- 연결 리스트: 메모리의 동적 할당을 기반으로 구현된 리스트
먼저 현재 공부하는 책에서 배열 리스트를 만드려하고 리스트 자료구조 ADT는 다음을 정의했다.
-ListInit: 리스트의 주소값을 인자로 전달
-LInsert: 리스트에 데이터를 저장
-LFirst: 첫번째 데이터를 저장
-LNext: 참조된 데이터 다음 데이터를 메모리에 저장
-LRemove: 마지막 반환 데이터를 삭제
-LCount: 리스트에 저장되있는 데이터 수 반환
위의 정의를 헤더파일과 소스파일로 구분하여 구현하였다.
http://www.orentec.co.kr/teachlist/DA_ST_1/teach_sub1.php
위 주소에서 만들어져 있는 소스파일을 받아 올 수 있었다.
리스트를 활용하는 방법을 익히고 리스트의 정의를 세부적으로 살펴보았다.
ArrayList.h, ArrayList.c를 받아와서
1. 리스트 생성 및 초기화 후 정수 1-9까지 리스트에 저장
2. 리스트에 저장된 값의 합을 계산하여 출력
3. 리스트에 저장된 값중 2,3 배수 삭제
4. 리스트에 저장된 데이터 출력
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#include <stdio.h>
#include "ArrayList.h"
int main(void)
{
List list;
int data;
ListInit(&list);
int total = 0;
for (int i = 1;i < 10;i++)
{
LInsert(&list, i);
}
if (LFirst(&list, &data))
{
total += data;
while (LNext(&list, &data))
total += data;
}
printf("%d\n", total);
if (LFirst(&list, &data))
{
if (data % 2 ==0 || data %3 ==0)
LRemove(&list);
while (LNext(&list, &data))
{
if (data % 2 == 0 || data % 3 == 0)
LRemove(&list);
}
}
if(LFirst(&list, &data))
{
printf("%d ", data);
while(LNext(&list, &data))
printf("%d ", data);
}
printf("\n\n");
return 0;
}
|
cs |
실행 결과는 다음과 같았다.
이후로 현재 구현되 있는 ADT를 분석해 보았다.
ArrayList.h:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
#define LIST_LEN 100
typedef int LData;
typedef struct __ArrayList
{
LData arr[LIST_LEN];
int numOfData;
int curPosition;
} ArrayList;
/*** ArrayList와 관련된 연산들 ****/
typedef ArrayList List;
void ListInit(List * plist);
void LInsert(List * plist, LData data);
int LFirst(List * plist, LData * pdata);
int LNext(List * plist, LData * pdata);
LData LRemove(List * plist);
int LCount(List * plist);
#endif
|
cs |
ListInit
plist를 초기화하고 curPosition(현재위치)를 초기화한다.
LInsert
plist에 data를 저장한다. numOfData(현재데이터양)이 배열크기 이상이면 멈춘다.
LFirst
현재위치를 초기화하고 pdata공간에 plist[curPosition] 처음 저장된 내용을 저장한다.
LNext
참조할 데이터가 없으면 반환하고
현재위치+1하고 데이터에 다음 내용을 저장한다.
LRemove
현재위치를 확인하고 데이터 위치를 확인한후 데이터를 삭제한다.
데이터를 삭제하고 그 이후 index값들을 한칸 씩 당겨준다.
현재위치를 한칸 당겨준다.
참고: 윤성우의 열혈 자료구조
고찰:
나중에 리스트를 스스로 구현해 봐야겠다.
'프로그래밍 > 개발' 카테고리의 다른 글
pwn 할때 쓰는 툴 (0) | 2022.08.02 |
---|---|
vim사용법 (0) | 2022.07.22 |
재귀 하노이탑 (0) | 2019.01.04 |
재귀 팩토리얼 피보나치 구현 (0) | 2019.01.04 |
순차 탐색, 이진 탐색 시간복잡도 (0) | 2019.01.01 |