#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");
}