자료구조 – 배열로 구현한 리스트 c언어 소스
#include <stdio.h> #define max 100 typedef struct { int array[max]; int size; }ArrayListType; typedef ArrayListType * ArrayList_ptr; void init(ArrayList_ptr list) { list->size = 0; } int is_empty(ArrayListType list) { if (list.size == 0) return 1; else return 0; } int is_full(ArrayListType list) { if (list.size == max) return 1; else return 0; } void insert_first(ArrayList_ptr list, int item) { if (!is_full(*list)) { for (int i = list->size - 1; i >= 0; i--) list->array[i + 1] = list->array[i]; list->array[0] = item; list->size++; } else printf("리스트가 꽉 차있습니다\n"); } // 맨 처음에는 삽입 불가능한 함수 // list[pos] 공간에 삽입 // pos는 리스트의 현존하는 인덱스 -> 리스트 크기가 n이면 pos는 0~(n-1)까지 존재 void insert(ArrayList_ptr list, int pos, int item) { if (!is_full(*list) && pos >= 0 && pos <= list->size - 1) { for (int i = list->size - 1; i >= pos; i--) list->array[i + 1] = list->array[i]; list->array[pos] = item; list->size++; } else printf("리스트가 꽉 차있습니다\n"); } void insert_last(ArrayList_ptr list, int item) { if (!is_full(*list)) { list->array[list->size] = item; list->size++; } else printf("리스트가 꽉 차있습니다\n"); } int delete_first(ArrayList_ptr list) { if (!is_empty(*list)) { int tmp = list->array[0]; for (int i = 1; i < list->size; i++) list->array[i - 1] = list->array[i]; list->size--; return tmp; } else printf("리스트가 비어 있습니다\n"); } int delete(ArrayList_ptr list, int pos) { if (!is_empty(*list) && pos >= 0 && pos < list->size) { int tmp = list->array[pos]; for (int i = pos + 1; i < list->size; i++) list->array[i - 1] = list->array[i]; list->size--; return tmp; } else printf("리스트가 비어 있습니다\n"); } int delete_last(ArrayList_ptr list) { if (!is_empty(*list)) { int tmp = list->array[list->size - 1]; list->size--; return tmp; } else printf("리스트가 비어 있습니다\n"); } void print_list(ArrayListType list) { for (int i = 0; i < list.size; i++) printf("%d ", list.array[i]); printf("size:%d\n", list.size); } int main() { ArrayListType list; init(&list); printf("삽입:"); insert_first(&list, 10); // 10 insert_first(&list, 11); // 11 10 insert_last(&list, 12); // 11 10 12 insert_last(&list, 13); // 11 10 12 13 insert(&list, 3,144); // 11 10 12 144 13 print_list(list); printf("\n삭제:"); delete_first(&list); // 10 12 144 13 delete_last(&list); // 10 12 144 delete(&list, 1); // 10 144 print_list(list); }
실용적인 리스트 소스 (Last In Last Out 구조 + 인덱스로 삭제)
#include <stdio.h> #include <stdlib.h> #pragma warning(disable:4996) #define max 30 typedef int element; typedef struct { element array[max]; int size; }ArrayListType; typedef ArrayListType * ArrayList_ptr; // 리스트 초기화 void init(ArrayList_ptr list) { list->size = 0; } // 리스트 생성 ArrayList_ptr create() { return (ArrayList_ptr)calloc(1, sizeof(ArrayListType)); } // 빈 리스트 확인 int is_empty(ArrayList_ptr list) { if (list->size == 0) return 1; else return 0; } // 풀 리스트 확인 int is_full(ArrayList_ptr list) { if (list->size == max) return 1; else return 0; } // 아이템 삽입 void insert_last(ArrayList_ptr list, element item) { if (!is_full(list)) { int pos = list->size; list->array[pos] = item; list->size++; } else printf("리스트가 꽉 차있습니다\n"); } // 아이템 삭제 void delete_last(ArrayList_ptr list) { if (!is_empty(list)) { list->size--; } else printf("리스트가 비어 있습니다\n"); } // 인덱스로 아이템 삭제 void delete_idx(ArrayList_ptr list, int pos) { if (!is_empty(list)) { element tmp = list->array[pos]; for (int i = pos + 1; i < list->size; i++) list->array[i - 1] = list->array[i]; list->size--; } else printf("리스트가 비어 있습니다\n"); } // 리스트 출력 void print_list(ArrayList_ptr list) { if (!is_empty(list)) { for (int i = 0; i < list->size; i++) printf("[%d] ", list->array[i]); } else printf("리스트가 비어 있습니다\n"); } int main() { ArrayList_ptr list = create(); init(list); insert_last(list, 1); // [1] insert_last(list, 2); // [1 2] insert_last(list, 3); // [1 2 3] insert_last(list, 4); // [1 2 3 4] insert_last(list, 5); // [1 2 3 4 5] delete_last(list); // [1 2 3 4] delete_last(list); // [1 2 3] delete_idx(list, 0); // [2 3] insert_last(list, 4); // [2 3 4] delete_idx(list, 1); // [2 4] print_list(list); // 리스트 요소 출력 }