VioletaBabel

단일 링크드 리스트 예제 본문

알고리즘
단일 링크드 리스트 예제
Beabletoet 2017. 4. 19. 20:00

#include <stdio.h>

#include <stdlib.h>//malloc

#include <conio.h> //getche

#define mal (node *)malloc(sizeof(node))

struct node

{

   int data;

   node *next;

};

node *head, *end, *node1, *node2, *node3, *node4, *node5;

int count = 0;

char command;

void startProgram();

void insertNode(node *newnode);

void checkCommand();

void numbering();

void rebuildnode(node *change);

void startProgram()

{

   printf("이 프로그램은 최대 5개까지의 숫자를 저장합니다.\n");

   head = mal, end = mal;

   int a;

   printf("첫번째 숫자를 입력해주세요 : ");

   scanf("%d", &a);

   node1 = mal;

   node1->data = a;

   head->next = node1;

   node1->next = end;

   ++count;

}

void insertNode(node *newnode)

{

   node *indexnode;

   int a;

   char fact;

   while (1)

   {

      printf("\n숫자를 입력하세요 : ");

      scanf("%d", &a);

      printf("원하는 숫자가 %d가 맞습니까? (맞으면 y): ", a);

      fact = getche();

      if (fact == 'y' || fact == 'Y') break;

   }

   printf("\n");

   newnode->data = a;

   for (indexnode = head; indexnode->next != end; indexnode = indexnode->next)

      if (indexnode->next->data > newnode->data)

         break;

   newnode->next = indexnode->next;

   indexnode->next = newnode;

   ++count;

   numbering();

}

void checkCommand()

{

   while (1)

   {

      printf("명령어는 다음과 같습니다.\ni=숫자 저장, o=저장중인 숫자 출력, e=종료\n명령어를 입력해주세요 : ");

      command = getche();

      if (command == 'i' || command == 'o' || command == 'e')

         break;

      printf("\n잘못 입력하셨습니다.\n");

   }

}

void numbering()

{

   node *indexnode = head;

   for (int i = 0; count > i; ++i)

   {

      indexnode = indexnode->next;

      printf("%d ",indexnode->data);

   }

   printf("\n");

}

void rebuildnode(node *change)

{

   printf("\n가장 낮은 숫자는 소거됩니다.");

   node *indexnode;

   int a;

   char fact;

   while (1)

   {

      printf("\n숫자를 입력하세요 : ");

      scanf("%d", &a);

      printf("원하는 숫자가 %d가 맞습니까? (맞으면 y): ", a);

      fact = getche();

      if (fact == 'y' || fact == 'Y') break;

   }

   if (change->data >= a)

   {

      printf("새로 입력한 숫자가 가장 작은 수와 같거나 더 작습니다.");

   }

   else

   {

      head->next = change->next;

      change->data = a;

      for (indexnode = head; indexnode->next != end; indexnode = indexnode->next)

         if (indexnode->next->data > change->data)

            break;

      change->next = indexnode->next;

      indexnode->next = change;

      printf("\n");

      numbering();

   }

}

int main()

{

   startProgram();

   while (1)

   {

      checkCommand();

      if (command == 'i')

      {

         switch (count)

         {

         case 0:node1 = mal; insertNode(node1); break;

         case 1:node2 = mal; insertNode(node2); break;

         case 2:node3 = mal; insertNode(node3); break;

         case 3:node4 = mal; insertNode(node4); break;

         case 4:node5 = mal; insertNode(node5); break;

         default:rebuildnode(head->next);

         }

      }

      else if (command == 'o')

      {

         printf("\n");

         numbering();

      }

      else if (command == 'e')

      {

         printf("\n");

         return 1;

      }

   }



Comments