본문 바로가기
DSA

리스트 1 (ArrayList)

by KWONE 2024. 8. 26.

리스트 ADT

  • 객체: n개의 element형으로 구성된 순서 있는 모임
  • 연산:
    • insert(list,pos,item) ::= pos 위치에 요소를 추가한다.
    • insert_last(list,item) ::= 맨 끝에 요소를 추가한다.
    • insert_first(list,item) ::= 맨 앞에 요소를 추가한다.
    • delete(list,pos) ::= pos 위치의 요소를 제거한다.
    • clear(list) ::= 리스트의 모든 요소를 제거한다.
    • get_entry(list,pos) ::= pos 위치의 요소를 반환한다.
    • get_length(list) ::= 리스트의 길이를 구한다.
    • is_empty(list) ::= 리스트가 비었는지를 검사한다.
    • is_full(list) ::= 리스트가 꽉 찾는지를 검사한다.
    • print_list(list) ::= 리스트의 모든 요소를 표시한다.

 

구현

배열을 사용한 리스트의 구현

배열을 사용하였기때문에 크기제한이 있으며 원하는 위치에 요소를 삽입할 경우 배열을 한칸씩 밀어줘야한다.

#define MAX_LIST_SIZE 100

typedef int element;
typedef struct {
	element array[MAX_LIST_SIZE];
    int size;
}ArrayListType;

기초 연산

void error(char* message)
{
	fprintf(stderr, "%s\n", message);
	exit(1);
}
void init(ArrayListType* l)
{
	l->size = 0;
}
int is_empty(ArrayListType* l)
{
	return l->size == 0;
}
int is_full(ArrayListType* l)
{
	return l->size == MAX_LIST_SIZE;
}
element get_entry(ArrayListType* l, int pos)
{
	if (pos < 0 || pos >= l->size) {
		error("위치오류");
	}
	return l->array[pos];
}
void print_list(ArrayListType* l)
{
	int i;
	for (i = 0; i < l->size; i++) {
		printf("%d->", l->array[i]);
	}
	printf("\n");
}

항목 추가 연산

void insert_last(ArrayListType* l, element item)
{
	if (l->size >= MAX_LIST_SIZE) {
		error("리스트 오버플로우");
	}
	l->array[l->size++] = item;
}
void insert(ArrayListType* l, int pos, element item)
{
	if (!is_full(l) && (pos >= 0) && (pos <= l->size)) {
		for (int i = (l->size - 1); i >= pos; i--) {
			l->array[i + 1] = l->array[i];
		}
		l->array[pos] = item;
		l->size++;
	}
}

항목 삭제 연산

element delete(ArrayListType* l, int pos)
{
	element item;
	if (pos < 0 || pos >= l->size) {
		error("위치 오류");
	}
	item = l->array[pos];
	for (int i = pos; i < (l->size - 1); i++) {
		l->array[i] = l->array[i + 1];
	}
	l->size--;
	return item;
}

실행

int main()
{
	ArrayListType list;
	init(&list);
	insert(&list, 0, 10);	print_list(&list);
	insert(&list, 0, 20);	print_list(&list);
	insert(&list, 0, 30);	print_list(&list);
	insert_last(&list,40);	print_list(&list);
	delete(&list, 0);	print_list(&list);
	return 0;
}

실행 시간 분석

get_entry() 연산은 시간복잡도 O(1), 삽입이나 삭제연산은 최대 O(n) ; 배열을 이동하기때문, 맨끝에 삽입하는경우는 O(1).

'DSA' 카테고리의 다른 글

스택 2개를 이용한 선형 큐의 구현  (0) 2024.10.25
다항식 계산기 (Polynomial Calculator)  (0) 2024.10.02
큐(Queue) 활용 예제  (0) 2024.08.26
덱(Deque) 2  (0) 2024.08.25
큐(Queue) 2  (0) 2024.08.22