1. 문제 설명

4단계까지 구현한 키오스크 프로그램은 커피 메뉴와 디저트 메뉴를 구조체 배열로 저장하고, 메뉴 등록 / 조회 / 변경 / 삭제 / 주문 / 재고관리(선택) 기능을 수행할 수 있다.  이번 5단계에서는 고정 크기의 구조체 배열을 사용하지 않고, 메뉴 리스트를 동적으로 관리하도록 수정한다. 

 

5단계는 두 부분으로 구성된다.

  • 5-1단계: 동적 메모리 할당 기반 메뉴 리스트(필수)
  • 5-2단계: 링크드 리스트 기반 메뉴 리스트 (심화 선택)

 

2. 목표

  • 메뉴 정보를 고정 크기 배열이 아닌 동적 메모리로 관리할 수 있다.
  • malloc(), realloc(), free()를 사용하여 메뉴 리스트 크기를 실행 중에 조정할 수 있다.
  • 메뉴 등록 시 필요한 만큼 메모리를 확장할 수 있다.
  • 메뉴 삭제 시 동적 메모리의 데이터를 정리할 수 있다.
  • 프로그램 종료 시 할당한 메모리를 해제할 수 있다.
  • 심화 단계에서는 링크드 리스트를 사용하여 메뉴를 노드 단위로 관리할 수 있다.

 

5-1단계: 동적 메모리 할당 기반 메뉴 리스트 (필수)

 

3. 요구사항

3.1 데이터 구조 수정

기존 고정 배열을 제거하고 포인터 변수를 사용하시오.

기존 코드 예:

MenuItem coffee_menu_list[10];
MenuItem dessert_menu_list[10];
 

수정 코드 예:

MenuItem* coffee_menu_list;
MenuItem* dessert_menu_list;

int coffee_count;
int dessert_count;

int coffee_capacity;
int dessert_capacity;
 

 

3.2 메뉴 리스트 초기화 기능 추가

프로그램 시작 시 메뉴 리스트를 동적 할당하시오. 초기 용량은 배열과 마찬가지로 커피 5개, 디저트 5개로 설정한다.

#define INIT_CAPACITY 5
 

예:

coffee_menu_list = malloc(sizeof(MenuItem) * INIT_CAPACITY);
dessert_menu_list = malloc(sizeof(MenuItem) * INIT_CAPACITY);
 

요구사항:

  • 메모리 할당 실패 시 오류 메시지를 출력한다. ( malloc() 리턴값 체크)
  • 초기 count는 0으로 설정한다.
  • 초기 capacity는 5로 설정한다.

3.3 메뉴 등록 기능 수정 - register_menu_item()

메뉴 등록 시 현재 저장된 메뉴 개수가 capacity와 같으면 메모리 크기를 확장하시오.

 

요구사항:

  • 커피 메뉴인지 디저트 메뉴인지 선택한다.
  • 메뉴명, 가격, 재고수량을 입력받는다.
  • menu_id는 자동 증가로 설정한다.
  • status는 기본값 판매중으로 설정한다.
  • 재고수량이 0이면 status를 품절로 설정한다.
  • 현재 배열이 가득 찼으면 realloc()을 사용하여 capacity를 2배로 확장한다.
  • 새 메뉴를 리스트에 저장한다.

출력 예:

메뉴구분 (1. 커피, 2. 디저트): 1
메뉴명 입력: 아메리카노
가격 입력: 3000
재고수량 입력: 20

[메모리 확장] coffee_menu_list capacity: 5 -> 10
[등록 완료]
 

 

3.4 메뉴 삭제 기능 수정 - delete_menu_item()

동적 메모리에서 메뉴를 삭제할 수 있도록 수정하시오.

 

요구사항:

  • 전체 메뉴를 출력한다.
  • 삭제할 메뉴 번호를 입력한다.
  • 해당 메뉴를 찾는다.
  • 메뉴가 존재하지 않으면 오류 메시지를 출력한다.
  • 삭제할 메뉴 뒤에 있는 메뉴들을 한 칸씩 앞으로 이동한다.
  • count를 1 감소시킨다.

출력 예:

삭제할 메뉴 번호 입력: 102

[삭제 완료]
 

 

3.5 메뉴 조회 기능 수정 - retrieve_menu_item()

동적 메모리에 저장된 메뉴 목록을 출력하시오.

 

요구사항:

  • coffee_count, dessert_count만큼 반복하여 출력한다.
  • capacity 크기 전체를 출력하지 않는다.
  • 재고수량도 함께 출력한다.

출력 예:

====================[Coffee]============================
No   Name                  Price    Status       Stock
========================================================
101  Americano              3000     AVAILABLE    20
102  Cafe Latte             4000     AVAILABLE    15

현재 저장 개수: 2
현재 배열 크기: 5
 

 

3.6 프로그램 종료 시 메모리 해제

프로그램 종료 전에 동적 할당한 메모리를 해제하시오.

 

요구사항:

  • free(coffee_menu_list);
  • free(dessert_menu_list);
  • free() 후 포인터를 NULL로 설정한다.

출력 예:

[프로그램 종료]
동적 메모리를 해제했습니다.
 

 

5-2단계: 링크드 리스트 기반 메뉴 리스트

4. 요구사항

4.1 데이터 구조 수정

메뉴 정보를 링크드 리스트 노드로 관리하시오. 

typedef struct menu_node {
    MenuItem data;
    struct menu_node* next;
} MenuNode;
 

커피 메뉴와 디저트 메뉴의 시작 노드를 각각 관리한다. 

MenuNode* coffee_head;
MenuNode* dessert_head;
 

 

4.2 메뉴 등록 기능 수정

메뉴 등록 시 새 노드를 동적 생성하여 리스트의 마지막에 추가하시오.

 

요구사항:

  • malloc()을 사용하여 새 노드를 생성한다.
  • 새 노드의 data에 메뉴 정보를 저장한다.
  • 새 노드의 next는 NULL로 설정한다.
  • 리스트가 비어 있으면 head가 새 노드를 가리키도록 한다.
  • 리스트가 비어 있지 않으면 마지막 노드 뒤에 새 노드를 연결한다.

출력 예:

메뉴구분 (1. 커피, 2. 디저트): 2
메뉴명 입력: 치즈케이크
가격 입력: 5000
재고수량 입력: 5

[노드 생성 완료]
[등록 완료]
 

 

4.3 메뉴 조회 기능 수정

링크드 리스트를 순회하면서 메뉴 정보를 출력하시오.

 

요구사항:

  • head부터 시작한다.
  • 현재 노드가 NULL이 될 때까지 반복한다.
  • 각 노드의 data를 출력한다.

출력 예:

====================[Coffee]============================
No   Name                  Price    Status       Stock
========================================================
101  Americano              3000     AVAILABLE    20
102  Cafe Latte             4000     AVAILABLE    15
 

 

4.4 메뉴 변경 기능 수정

링크드 리스트에서 메뉴 번호를 검색하여 메뉴 정보를 수정하시오.

 

요구사항:

  • 전체 메뉴를 출력한다.
  • 수정할 메뉴 번호를 입력한다.
  • head부터 순회하며 menu_id가 일치하는 노드를 찾는다.
  • 메뉴명, 가격, 판매상태, 재고수량 중 수정 항목을 선택한다.
  • 재고수량이 0이면 판매상태를 품절로 변경한다.
  • 재고수량이 1 이상이면 판매상태를 판매중으로 변경할 수 있다.

4.5 메뉴 삭제 기능 수정

링크드 리스트에서 특정 메뉴 노드를 삭제하시오.

 

요구사항:

  • 삭제할 메뉴 번호를 입력한다.
  • 삭제할 노드를 찾는다.
  • 삭제할 노드가 head인 경우 head를 다음 노드로 변경한다.
  • 중간 또는 마지막 노드인 경우 이전 노드의 next를 삭제할 노드의 next로 연결한다.
  • 삭제한 노드는 free()로 해제한다.

출력 예:

삭제할 메뉴 번호 입력: 101

[삭제 완료]
노드 메모리를 해제했습니다.
 

 

4.6 프로그램 종료 시 전체 노드 해제

프로그램 종료 전에 모든 노드를 해제하시오.

 

요구사항:

  • 커피 리스트의 모든 노드를 해제한다.
  • 디저트 리스트의 모든 노드를 해제한다.
  • 노드를 하나씩 순회하면서 free()를 수행한다.

출력 예:

[프로그램 종료]
커피 메뉴 리스트 메모리를 해제했습니다.
디저트 메뉴 리스트 메모리를 해제했습니다.
 

 

5. 제출 형식

분할된 소스코드 파일을 제출한다.

main.c
kiosk_ui.c
kiosk_ui.h
menu_item.c
menu_item.h
order.c
order.h

 

5-2단계 링크드 리스트까지 구현한 경우, menu_item을 linked list로 정의하고 리스트에 추가/삭제/항목 가져오는 등의 기능을 구현한 파일을 별도 파일로 (예: menu_list.c, menu_list.h) 관리할 수 있다. 

+ Recent posts