# 네이버 _ 2017_10_21
# include <stdio.h>
# include <stdlib.h>
# include <stdbool.h>
//+++++++++++++++++++++++++++++++++++++
typedef struct _NaverStu
{
int* pArray;
int secondSmall;
int firstSmall;
int sizeValue;
}NaverStu;
//+++++++++++++++++++++++++++++++++++++
NaverStu* creatNode();
void _init_(NaverStu** param);
void _arraySize_(NaverStu** param);
void _elementWrite_(NaverStu** param);
void _smallTwoValue_(NaverStu** param);
//+++++++++++++++++++++++++++++++++++++
int main(void)
{
NaverStu* node = NULL;
node = creatNode();
_init_(&node);
_arraySize_(&node);
_elementWrite_(&node);
_smallTwoValue_(&node);
free(node);
return 0;
}
//+++++++++++++++++++++++++++++++++++++
NaverStu* creatNode()
{
NaverStu* pNode = (NaverStu*)malloc(sizeof(NaverStu));
return pNode;
} // end of creatNode function
//+++++++++++++++++++++++++++++++++++++
void _init_(NaverStu** param)
{
if ((*param) == NULL)
{
fprintf(stderr, "malloc error ... !!!\n");
exit(1);
}
else
{
(*param)->pArray = NULL;
(*param)->secondSmall = 0;
(*param)->firstSmall = 0;
(*param)->sizeValue = 0;
}
} // end of _init_ function
//+++++++++++++++++++++++++++++++++++++
void _arraySize_(NaverStu** param)
{
int tmpSize = 0;
int* ptr = NULL;
printf("크기 입력: ");
scanf("%d", &tmpSize);
(*param)->sizeValue = tmpSize;
(*param)->pArray = (int*)malloc(sizeof(int)*tmpSize);
if ((*param)->pArray == NULL)
{
fprintf(stderr, "malloc error... !!!\n");
exit(1);
}
else // (*param)->pArray != NULL
{ // Initiallize____________________________
ptr = (*param)->pArray;
for (int i = 0; i < tmpSize; i++)
{
*(ptr + i) = 0;
}
// data printf____________________________
for (int i = 0; i < tmpSize; i++)
{
printf("%d ", *(ptr + i));
}
printf("\n"); // 개행
}
}
void _elementWrite_(NaverStu** param)
{
int tmpSmall = 0;
int* pNode = NULL;
pNode = (*param)->pArray;
for (int i = 0; i < (** param).sizeValue; i++)
{
printf("[%d] 번째 값 입력 => ", i+1);
scanf("%d", (pNode + i));
// 배열중에 가장 작은 수____________________
if (i == 0)
{
tmpSmall = *(pNode + i);
}
else
{ // i != 0
if (tmpSmall > *(pNode + i))
{
tmpSmall = *(pNode + i);
}
}
}
(*param)->firstSmall = tmpSmall;
} // end of _elementWrite_ function
void _smallTwoValue_(NaverStu** param)
{
bool flag = false;
int index = 0;
int tmpTwoSmall = 0;
// 가장 작은 값보다 큰 수
while (true)
{
if ((*param)->firstSmall < (*param)->pArray[index])
{
(*param)->secondSmall = (*param)->pArray[index];
flag = true;
break;
}
else
{ // (*param)->firstSmall < (*param)->pArray[index]
index++; // 후위 증감식
if (index == (*param)->sizeValue) { break; }
}
}
if (flag == false)
{
printf("second small value => %d\n", (*param)->firstSmall);
}
else
{// flag == true
// case 1 : "두번째로 작은 값이 마지막 위치에 있을 경우"
if (index == (*param)->sizeValue - 1)
{
printf("second small value => %d\n", (*param)->secondSmall);
}
// case 1
else
{ // index != (*param)->sizeValue - 1
for (int i = index + 1; i < (*param)->sizeValue; i++)
{
if ((*param)->pArray[i] != (*param)->firstSmall)
{
if ((*param)->secondSmall > (*param)->pArray[i])
{
(*param)->secondSmall = (*param)->pArray[i];
}
}
}
}
printf("second small value => %d\n", (*param)->secondSmall);
}
} // end of _smallTwoValue_ function