큐 구현

카테고리 없음2016. 1. 16. 21:39

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define TRUE 1
#define END 0
typedef int element;
typedef struct dataNode
{
 element data;
 struct dataNode* linked;
}dataNode, *dataNodePointer;
typedef struct queueType
{
 dataNodePointer front;
 dataNodePointer rear;
 int dataCnt;
}queueType, *queueTypePointer;
// <<<< function >>>>
queueTypePointer createQueueType();//[1]
void dataInput(queueTypePointer);//[2]
element dataRemove_front(queueTypePointer);//[3]
element dataRemove_rear(queueTypePointer);//[4]
element dataRemove_middle(queueTypePointer);//[5]
void dataPrintf(queueTypePointer);//[6]
// <<<< 메인 >>>>
int main(void)
{
 queueTypePointer start_H = NULL;
 start_H = createQueueType();
 char choice;
 printf("[1] 데이터 삽입\n");
 printf("[2] 첫번째 데이터 삭제\n");
 printf("[3] 마지막 데이터 삭제\n");
 printf("[4] 원하는 위치 데이터 삭제\n");
 printf("[5] 데이터 출력\n");
 printf("[6] 종료\n");
 while (TRUE)
 {
  printf("선택 >>>  ");
  scanf_s("%c", &choice);
  switch (choice - '0')
  {
  case 1: printf("데이터 삽입 과정\n");
    dataInput(start_H);
    break;
  case 2: printf("첫번째 데이터 삭제 과정 ");
    printf("[%d]\n",dataRemove_front(start_H));
    break;
  case 3: printf("마지막 데이터 삭제 과정 ");
    printf("[%d]\n",dataRemove_rear(start_H));
    break;
  case 4: printf("원하는 위치 데이터 삭제 과정 ");
    printf("[%d]\n", dataRemove_middle(start_H));
    break;
  case 5: printf("데이터 출력\n");
    dataPrintf(start_H);
    break;
  case 6: printf("종료\n");
    return END;
  default: printf("메뉴에 없는 값을 입력하셨습니다.\n");
    break;
  }
  fflush(stdin);
 }
 return 0;
}
//[1]
queueTypePointer createQueueType()
{
 queueTypePointer q_h = (queueTypePointer)malloc(sizeof(queueType));
 if (q_h == NULL){
  printf("동적할당 실패!!\n");
  return END;
 }
 else
 //q_h !=NULL
 {
  memset(q_h, 0, sizeof(queueType));
  return q_h;
 }
}
//[2]
void dataInput(queueTypePointer q)
{
 dataNodePointer newInsertData = (dataNodePointer)malloc(sizeof(dataNode));
 int dataOFinteger = 0;
 if (newInsertData == NULL){
  printf("동적할당 실패\n");
  return;//END
 }
 else
 {
  q->dataCnt++;//데이터 갯수 +1
  memset(newInsertData, 0, sizeof(dataNode));
  printf("삽입 할 데이터 입력:  ");
  scanf_s("%d", &dataOFinteger);
  newInsertData->data = dataOFinteger;
  if (q->front == NULL)
  {
   q->front = newInsertData; 
   q->rear = newInsertData;
  }
  else
  //q->front != NULL
  {
   q->rear->linked = newInsertData;
   q->rear = newInsertData;
  }
 }
}
//[3]
element dataRemove_front(queueTypePointer q)
{
 element removeData = 0;
 dataNodePointer removeData_POINTER = NULL;
 if (q->front == NULL)
 {
  printf("삭제할 데이터가 없습니다.\n");
  return END;
 }
 else
 //q->front != NULL
 {
  q->dataCnt--;//데이터 갯수 -1
  if (q->front == q->rear)
  {
   removeData_POINTER = q->front;
   removeData = q->front->data;
   q->front = NULL;
   q->rear = NULL;
   free(removeData_POINTER);
   return removeData;
  }
  else
  //q->front != q->rear
  {
   removeData_POINTER = q->front;
   removeData = q->front->data;
   q->front = q->front->linked;
   free(removeData_POINTER);
   return removeData;
  }
 }
}
//[4]
element dataRemove_rear(queueTypePointer q)
{
 element removeData = 0;
 dataNodePointer removeData_POINTER = NULL;
 dataNodePointer index = NULL;
 if (q->front == NULL)
 {
  printf("삭제할 데이터가 없습니다.\n");
  return END;
 }
 else
  //q->front != NULL
 {
  q->dataCnt--;//데이터 갯수 -1
  if (q->front == q->rear)
  {
   removeData_POINTER = q->front;
   removeData = q->front->data;
   q->front = NULL;
   q->rear = NULL;
   free(removeData_POINTER);
   return removeData;
  }
  else
   //q->front != q->rear
  {
   index = q->front;
   while (index->linked != q->rear)
   {
    index = index->linked;
   }
   removeData_POINTER = index->linked;
   removeData = q->rear->data;
   q->rear = index;
   q->rear->linked = NULL;
   free(removeData_POINTER);
   return removeData;
  }
 }
}
//[5]
element dataRemove_middle(queueTypePointer q)
{
 int position_remove_data;
 int i;
 element removeData = 0;
 dataNodePointer removeData_POINTER = NULL;
 dataNodePointer index = NULL;
 printf("삭제하고자 하는 위치를 입력하세요: ");
 scanf_s("%d", &position_remove_data);
 if (position_remove_data <= 0 || position_remove_data > q->dataCnt)
 {
  printf("삭제할 수 없는 위치입니다.\n");
  return END;
 }
 else
 //(position_remove_data > 0 && position_remove_data <= q->dataCnt)
 {
  q->dataCnt--;//데이터 갯수 -1
  index = q->front;
  for (i = 1; i < position_remove_data - 1; i++)
  {
   index = index->linked;
  }
  if ((index == q->front) && (index == q->rear))
  {
   removeData_POINTER = index;
   removeData = index->data;
   q->front = NULL;
   q->rear  = NULL;
   free(removeData_POINTER);
   return removeData;
  }
  if (index->linked == q->rear)
  {
   removeData_POINTER = index->linked;
   removeData = index->linked->data;
   q->rear = index;
   q->rear->linked = NULL;
   free(removeData_POINTER);
   return removeData;
  }
  if (index == q->front)
  {
   removeData_POINTER = index;
   removeData = index->data;
   q->front = q->front->linked;
   free(removeData_POINTER);
   return removeData;
  }
  removeData_POINTER = index->linked;
  removeData = index->linked->data;
  index->linked = index->linked->linked;
  free(removeData_POINTER);
  return removeData;
 }
}
void dataPrintf(queueTypePointer q)

 dataNodePointer index = NULL;
 if (q->front == NULL)
 {
  printf("출력할 데이터가 없습니다.\n");
  return;//END
 }
 else
 //q->front != NULL
 {
  for (index = q->front; index; index = index->linked)
  {
   printf("%d ", index->data);
  }
 }
 printf("\n");
}