쌓고 쌓다

[자료구조] 배열로 만든 리스트 본문

알고리즘/자료구조

[자료구조] 배열로 만든 리스트

승민아 2022. 4. 4. 20:40

배열로 만든 리스트

  • 구현이 간단하다.
  • 삽입, 삭제 시 오버헤드 문제 발생
  • 항목의 개수가 제한적

 

구조체 구현

#define MAX_SIZE 10
using namespace std;
typedef int element;

typedef struct {
	int length; // 저장된 개수
	element list[MAX_SIZE];
}ArrayListType;

 

초기화 함수

void init(ArrayListType* L)
{
	L->length = 0;
}

 

is_empty 함수

bool is_empty(ArrayListType* L)
{
	if (L->length == 0)
		return true;
	return false;
}

 

is_full 함수

bool is_full(ArrayListType* L)
{
	if (L->length == MAX_SIZE)
		return true;
	return false;
}

 

Add 함수

void Add(ArrayListType* L, int pos, element item)
{
	if (!is_full(L) && pos <= L->length
		&& pos >= 0)
	{
		for (int i = L->length - 1; i >= pos; i--) // 한칸씩 오른쪽으로 옮기는 과정
			L->list[i + 1] = L->list[i];

		L->list[pos] = item; // 내가 원하는 위치에 삽입
		L->length++;
	}

}

리스트가 꽉 차지 않았고, 삽입할 위치가 현재 리스트에 포함된 요소 개수보다 작거나 같아야 합니다.

pos가 length보다 작을 경우 중간에 삽입하는 경우이며

pos가 length랑 같을 경우 리스트 맨 끝에 삽입을 해주는 경우이다.

원하는 위치에 삽입을 하기 위해 그 위치부터 오른쪽 끝까지의 원소들을 한 칸씩 오른쪽으로 옮겨주어야 한다.

 

Delete 함수 

element Delete(ArrayListType* L, int pos)
{
	if (pos < 0 || pos >= L->length)
	{
		cout << "범위 에러";
		return -1;
	}

	element item = L->list[pos];
	for (int i = pos; i < L->length - 1; i++) // 삭제위치의 오른쪽 원소들 왼쪽으로 한칸씩 이동
		L->list[i] = L->list[i + 1];
	L->length--;
	return item;
}

범위 에러의 경우 pos가 음수이거나

삭제할 인덱스(위치)가 현재 원소의 개수보다 클 경우 원소가 존재도 안하는 경우니 에러이다.

pos 위치에 원소를 삭제한 경우, 그 위치의 공백이 생기니

오른쪽의 원소들을 다들 왼쪽으로 한칸씩 땡겨 앉으면 된다.

 

전체 코드

#include <iostream>
#define MAX_SIZE 10
using namespace std;
typedef int element;

typedef struct {
	int length; // 저장된 개수
	element list[MAX_SIZE];
}ArrayListType;

void init(ArrayListType* L)
{
	L->length = 0;
}

bool is_empty(ArrayListType* L)
{
	if (L->length == 0)
		return true;
	return false;
}

bool is_full(ArrayListType* L)
{
	if (L->length == MAX_SIZE)
		return true;
	return false;
}

void Add(ArrayListType* L, int pos, element item)
{
	if (!is_full(L) && pos <= L->length
		&& pos >= 0)
	{
		for (int i = L->length - 1; i >= pos; i--)
			L->list[i + 1] = L->list[i];

		L->list[pos] = item;
		L->length++;
	}

}

element Delete(ArrayListType* L, int pos)
{
	if (pos < 0 || pos >= L->length)
	{
		cout << "범위 에러";
		return -1;
	}

	element item = L->list[pos];
	for (int i = pos; i < L->length - 1; i++)
		L->list[i] = L->list[i + 1];
	L->length--;
	return item;
}

int main(void)
{
	ArrayListType arrlist;
	init(&arrlist);
}

'알고리즘 > 자료구조' 카테고리의 다른 글

[자료구조] 트리 용어  (0) 2022.05.03
[자료구조] 리스트  (0) 2022.04.06
[자료구조] 큐(Queue)  (0) 2022.03.30
[자료구조] 스택(Stack)  (0) 2022.03.23
[자료구조] 희소행렬 덧셈  (0) 2022.03.16
Comments