//////
Search
📒

배열 리스트

1. 소스코드

#include <stdio.h> #include <stdlib.h> #define MAX_SIZE 10 typedef int element; typedef struct { element *array; // 배열 포인터 정의 int size; // 데이터 크기(개수) int capacity; // 크기(용량) } ArrayListType; // 프린트 함수 void print_list(ArrayListType *list) { // size값을 토대로 반복 출력 for(int i=0; i<list->size; i++) { printf("%d ", list->array[i]); } printf("\n"); } int is_full(ArrayListType *list) { if(list->size >= list->capacity) { return 1; } return 0; } int is_empty(ArrayListType *list) { if(list->size == 0) { return 1; } return 0; } // 초기화 함수 void init(ArrayListType *list) { printf("배열 리스트의 크기를 입력해주세요 >> "); scanf("%d", &list->capacity); list->size = 0; // 리스트 항목 개수 초기화 list->array = (element *)malloc(sizeof(element) * list->capacity); // 입력받은 값 토대로 배열 동적할당 } // 첫 인덱스에 데이터를 삽입하는 함수 void insert_first(ArrayListType *list, element value) { if(is_full(list)) { printf("리스트가 가득 찼습니다\n"); return; } list->size++; // 개수 증가 for(int i = list->size - 1; i > 0; i--) { // 원소들 뒤로 미루기 list->array[i] = list->array[i - 1]; } list->array[0] = value; // 0번째 인덱스에 값 넣어주기 } // 마지막에 데이터를 넣어주는 함수 void insert_last(ArrayListType *list, element value) { if(is_full(list)) { printf("리스트가 가득 찼습니다\n"); return; } list->array[list->size++] = value; // 값 넣어주기 list->size++; // 개수 증가 } // 첫 인덱스의 데이터를 지우는 함수 void delete_first(ArrayListType *list) { if(is_empty(list)) { printf("리스트가 비어있습니다\n"); return; } // 원소들을 당겨줍니다 for(int i=0; i<list->size-1; i++) { list->array[i] = list->array[i+1]; } list->size--; // 개수 감소 } // 마지막 요소 지우는 함수 void delete_last(ArrayListType *list) { if(is_empty(list)) { printf("리스트가 비어있습니다\n"); return; } list->size--; // 개수 감소 } // 넣고 싶은 자리에 데이터를 넣어주는 함수 void insert(ArrayListType *list, element value, int index_position) { if (index_position < 0 || index_position > list->size) { // 유효하지 않은 인덱스 위치인 경우 printf("유효하지 않은 인덱스 위치입니다\n"); return; } if(is_full(list)) { // 리스트가 가득 찬 경우 printf("리스트가 가득 찼습니다\n"); return; } // 인덱스 위치에 데이터를 삽입하기 위해 기존의 데이터를 한 칸씩 뒤로 이동시킵니다. for (int i = list->size; i > index_position; i--) { list->array[i] = list->array[i - 1]; } // 새로운 데이터를 인덱스 위치에 삽입합니다. list->array[index_position] = value; list->size++; // 데이터 크기 증가 } // 특정 위치의 데이터를 삭제하는 함수 void delete(ArrayListType *list, int index_position) { if (index_position < 0 || index_position >= list->size) { // 유효하지 않은 인덱스 위치인 경우 printf("유효하지 않은 인덱스 위치입니다\n"); return; } if (is_empty(list)) { // 리스트가 비어 있는 경우 printf("리스트가 비어있습니다\n"); return; } // 삭제하려는 데이터의 인덱스 위치 이후의 데이터를 한 칸씩 앞으로 당겨줍니다. for (int i = index_position; i < list->size - 1; i++) { list->array[i] = list->array[i + 1]; } list->size--; // 데이터 크기 감소 } int main(void) { ArrayListType list; // 배열 리스트 생성 init(&list); // 초기화 // 요소 추가 insert_last(&list, 10); insert_last(&list, 20); insert_last(&list, 30); insert(&list, 50, 2); insert_first(&list, 90); // 리스트 출력 printf("리스트 출력: "); print_list(&list); // 요소 삭제 delete_last(&list); delete(&list, 2); delete_first(&list); // 리스트 출력 printf("요소 삭제 후 리스트 출력: "); print_list(&list); // 동적 메모리 할당 해제 free(list.array); return 0; }
C
복사

2. 실행결과

3. 고찰

논리적으로 함수의 과정을 짜내려가면서 생각했던 것보다 자잘한 실수가 많았다고 생각됩니다. 그렇지만 그렇게 어려운 작업은 아니었다고 생각하긴하고, 그저 써야할 코드의 양이 좀 있다보니 힘들었다고 생각이 들었습니다. 지난번과는 다르게, 참조연산자와 주소연산자 및 포인터를 실수를 찾는 과정의 구글링을 제외하고는 잘 사용한 것 같아서 나름 만족스러웠습니다.