#include <stdio.h>
/*-----------strcmp, strcpy, strlen, memset ------*/
int mystrcmp(char *str1, char *str2)
{
char *s1 = str1, *s2 = str2;
while (*s1 || *s2) {
if (*s1 > *s2) return 1;
else if (*s1 < *s2) return -1;
s1++; s2++;
}
return 0;
}
void mystrcpy(char *str1, char *str2)
{
char *s1 = str1, *s2 = str2;
while (*s2) *s1++ = *s2++;
*s1 = '\0';
}
int mystrlen(char *str1)
{
char *s1 = str1;
int n = 0;
while (*s1++) n++;
return n;
}
void mymemset(char *str1, char c, int n)
{
int i;
for (i = 0; i < n; i++) s1[i] = c;
}
/*-------------------------------------------------*/
void wsort(char words[300][21], char buf[21], int wcnt);
int get_pos(char words[300][21], char buf[21], int wcnt);
main(int argc, char *argv[])
{
char words[300][21] = {"\0", };
char buf[21] = "\0";
int i = 0, wcnt = 0;
printf("0을 입력하면 입력을 종료합니다.\n");
for (i = 0; i < 300; i++) {
printf("%d 번째 단어를 입력하세요 : ", i+1);
scanf("%s", buf);
if (mystrlen(buf) == 1 && buf[0] == '0') break;
wsort(words, buf, wcnt);
mymemset(buf, '\0', sizeof(buf));
wcnt++;
}
mystrcpy(buf, "0");
for (i = 0; i < wcnt; i++) {
if (mystrcmp(buf, words[i]) != 0) {
printf("%d : %s\n", i, words[i]);
mystrcpy(buf, words[i]);
}
}
}
void wsort(char words[300][21], char buf[21], int wcnt)
{
int pos;
int i;
if (wcnt > 0) {
pos = get_pos(words, buf, wcnt);
for (i = wcnt; i >= pos; i--) mystrcpy(words[i + 1], words[i]);
mystrcpy(words[pos], buf);
}
else mystrcpy(words[0], buf);
}
int get_pos(char words[300][21], char buf[21], int wcnt)
{ /*--- 이분탐색(binary search)으로 정렬합니다 ---*/
int first = 0;
int mid;
int last = wcnt - 1;
int result;
while (result != 0) {
mid = (last - first + 1) / 2 + first;
result = mystrcmp(buf, words[mid]);
if (result == 0) return mid;
else if (result > 0) first = mid + 1;
else if (result < 0) last = mid - 1;
if (first > last) return first;
}
}