🙇‍♀️CreateMenu


🪐CreateMenu

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

typedef struct node
{
   int childCount;
   char name[50];
   struct node* parentNode;
   struct node* childNode[10];
}node;

int dirDeepth = 0;


void showMenu(node* node); // childNode를 출력하고 상위메뉴, 메뉴입력, 종료 출력
void AddMenu(node* node); // 동적할당 해주기(노드 생성)
void EnterMenu(node* childNode); // childNode로 들어가기
void BackMenu(node* node); // 부모님 노드로 이동
void InputMenu(node* node);
void exitPrg(); // 프로그램 종료
void ModfMenu(node* node);
void DelMenu(node* node);


int main()
{
   int input;


   //node* rootNode = {0, };
   struct node* rootNode = (struct node*)malloc(sizeof(struct node));
   memset(rootNode, 0, sizeof(struct node)); // 구조체 초기화 인터넷에서 찾음
   strcpy(rootNode->name, "Root");

   while (1)
   {
      showMenu(rootNode);
   }

}

void showMenu(node* node)
{
   system("cls");

   if (dirDeepth == 0)
      printf("================ 루트 디렉토리 입니다 ================\n");
   else
      printf("============== %d 수준 메뉴 시스템입니다 ==============\n", dirDeepth);

   int i = 1;
   //for (i; i < len(node.childNode); i++)
   for (i; i < 10; i++)
   {
      // childNode name 다 출력
      if (node->childNode[i - 1] == 0) break;
      printf("%d. %s\n", i, node->childNode[i - 1]->name);

   }

   printf("%d. 상위 메뉴로\n", i + 0);
   printf("%d. 메뉴 입력\n", i + 1);
   printf("%d. 종료\n", i + 2);
   printf("원하는 동작을 입력하세요. >>\n");

   int input;
   scanf("%d", &input);


   if (input < i)
   {
      EnterMenu(node->childNode[input - 1]);
   }
   else if (input == i + 0)
   {
      BackMenu(node);
   }
   else if (input == i + 1)
   {
      // 메뉴 입력
      InputMenu(node);
   }
   else if (input == i + 2)
   {
      // 종료
      exitPrg();
   }
}

void AddMenu(node* node)
{
   //struct node* newNode = {0, };
   struct node* newNode = (struct node*)malloc(sizeof(struct node));
   memset(newNode, 0, sizeof(struct node)); // 구조체 초기화 인터넷에서 찾음

   printf("현재 메뉴 수준은 %d 입니다\n", dirDeepth);

   if (dirDeepth == 0)
   {
      printf("입력하시는 메뉴은 루트 메뉴입니다");
   }
   else
   {
      // todo
      printf("입력하시는 상위 메뉴은 %d 수준의 입니다", dirDeepth - 1);
   }

   printf("원하시는 메뉴의 이름을 입력하세요\n");

   char name[50];
   scanf(" %[^\n]s", name);
   strcpy(newNode->name, name);

   newNode->parentNode = node;


   for (int i = 0; i < 10; i++)
      if (node->childNode[i] == NULL)
      {
         node->childNode[i] = newNode;
         break;
      }

   //node->childNode[0] = newNode;

   //dirDeepth++;

   showMenu(node);
}

void EnterMenu(node* childNode)
{
   dirDeepth++;

   showMenu(childNode);
}

void BackMenu(node* node)
{
   // 상위메뉴
   if (dirDeepth == 0)
   {
      printf("최상위 디렉토리 입니다\n");
      printf("2초뒤 돌아갑니다\n");
      Sleep(2000); // 화면 2초 정지?
      return;
   }

   dirDeepth--;

   showMenu(node->parentNode);
}

void InputMenu(node* node)
{
   printf("원하는 동작을 입력하세요.\n");
   printf(">> 1. 메뉴 추가  2. 메뉴 수정  3. 메뉴 삭제\n");
   printf(">> ");


   int input;
   scanf("%d", &input);

   switch (input)
   {
   case 1:
      AddMenu(node);
      break;
   case 2:
      ModfMenu(node);
      break;
   case 3:
      DelMenu(node);
      break;
   default:
      break;
   }
}

void exitPrg()
{
   printf("프로그램을 종료합니다");
   exit(-1);
}


void ModfMenu(node* node)
{
   // TODO
   int index;
   for (int i = 1; i < 10; i++)
   {
      // childNode index 출력
      if (node->childNode[i - 1] == 0) break;
      printf("menu[%d].name=\"%s\"\n", i, node->childNode[i - 1]->name);
   }
   printf("수정하고 싶은 배열의 숫자를 입력하세요\n");
   scanf("%d", &index);

   printf("새로 지을 이름을 입력하세요\n");
   char newName[50];
   scanf(" %[^\n]s", newName);
   strcpy(node->childNode[index - 1]->name, newName);
   
}

void DelMenu(node* node)
{
   int input;
   for (int i = 1; i < 10; i++)
   {
      // childNode index 출력
      if (node->childNode[i - 1] == 0) break;
      printf("menu[%d].name=\"%s\"\n", i, node->childNode[i - 1]->name);
   }
   printf("진행하시겠습니까? 1. 진행 2. 취소\n");
   scanf("%d", &input);

   if (input == 1)
   {
      printf("삭제하고 싶은 배열의 숫자를 입력하세요\n");
      int index;
      scanf("%d", &index);
      printf("선택한 배열은 %d 입니다\n", index);
      // TODO 예외 처리 필요
      printf("맞으면 1, 틀리면 2를 입력해주세요\n");

      int input2;
      scanf("%d", &input2);
      if (input2 == 1)
      {
         // 메뉴의 인덱스에 맞게 선택하면 삭제

         // free 생각
         node->childNode[index - 1] = NULL;
         showMenu(node);
      }
      else if (input2 == 2)
      {
         showMenu(node);
      }
      else
      {
         printf("1 혹은 2를 선택해 주세요");

      }
   }
   else if (input == 2)
   {
      // cancle
      showMenu(node);
   }
   else
   {
      printf("1 혹은 2를 선택해 주세요\n");
   }


}