#include
#include
#include
char menu();
void input();
void output();
void search();
void del();
void sort();
void insert();
void allDeleteList();
void initList();
struct Node{
char name[20];
struct Node *ptr;
};
struct Node *headp, *tailp, *tp, *np;
void main()
{
char menuNumber; //menu함수 return값
initList(); //링크드리스트 껍데기 생성
while(1){
system("cls");
menuNumber = menu(); //menu() return 값 저장 변수
/* 함수 호출 (각 함수에 입력된 단어와 뜻을 담을 구조체와 카운터변수를 넘겨줌)*/
if(menuNumber == '1'){ system("cls"); input();}
else if(menuNumber == '2'){system("cls"); output(); }
else if(menuNumber == '3'){system("cls"); search(); }
else if(menuNumber == '4'){system("cls"); del(); }
else if(menuNumber == '5'){system("cls"); sort(); }
else if(menuNumber == '6'){system("cls"); insert(); }
else if(menuNumber == '7'){allDeleteList();break;}
else{printf("\n # 잘못입력하셨습니다. 아무키나 누른 후 다시 입력하세요. "); getch();}
}
}
char menu() //메뉴 출력
{
printf("\n\n\n\n\n\n");
printf(" 1. 입력하기(create) \n\n");
printf(" 2. 출력하기(display) \n\n");
printf(" 3. 검색하기(search) \n\n");
printf(" 4. 삭제하기(delete) \n\n");
printf(" 5. sort하기(sort) \n\n");
printf(" 6. 추가하기(insert) \n\n");
printf(" 7. 종 료 \n\n");
printf(" # 메뉴를 선택하세요 : ");
char menuNumber=getchar();
fflush(stdin);
return menuNumber; //입력받은 메뉴 번호 return
}
void input(){
/*
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf(" 1번 입력하기 메뉴입니다. \n\n\n\n\n");
printf(" # 아무키나 누르면 주메뉴로 돌아갑니다. \n\n\n\n");
getch();
*/
char temp[20]; //임시 저장공간
if(headp->ptr!=tailp){ // 새로 만드는 것이 아니면 주메뉴로 돌아감
printf("* 링크드 리스트가 이미 존재합니다. [추가하기] 메뉴를 선택하세요.\n");
printf("* 아무키나 누르면 주메뉴로 돌아갑니다.");
getch();
return;
}
tp = headp;
while (1){
printf("#이름을 입력하세요 : "); //이름 입력 받기
gets(temp);
if(strcmp(temp,"end") == 0){break;} //입력단어가 end이면 종료
tp->ptr = (struct Node*)malloc(sizeof(struct Node)); //새노드 생성
tp = tp->ptr; // 한노드 이동하기
strcpy(tp->name,temp);
tp->ptr = tailp;
}
return;
}
void output(){
/*
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf(" 2번 출력하기 메뉴입니다. \n\n\n\n\n");
printf(" # 아무키나 누르면 주메뉴로 돌아갑니다. \n\n\n\n");
getch();
*/
int count=1;
tp = headp->ptr;
while(tp != tailp){ //마직막 빈노드가 아닐시 까지
if(count%10==1 && count != 1) {
printf("Press any Key...\n");
getch();
} // 10명씩 끊어서 출력하기
printf("이름 %2d : %s \n", count++, tp->name);
tp = tp->ptr;
}
getch();
return;
}
void search(){
/*
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf(" 3번 검색하기 메뉴입니다. \n\n\n\n\n");
printf(" # 아무키나 누르면 주메뉴로 돌아갑니다. \n\n\n\n");
getch();
*/
char temp[20]; //입력받을 이름저장 공간
int temp1=0; //검색시 전체를 검색하기때문에 출력시 오류 방지를 위해
//같은문자열이 확실히없다는것을 보여주기위한 temp1 변수 선언
int count=1; //카운터 변수
while (1){
tp = headp->ptr; // tp가 맨처음을 가르킨다 무한루프 동안에
printf("# 찾는 이름를 입력하세요 : ");
gets(temp); //이름 입력
if(strcmp(temp,"end") == 0){break;} //입력단어가 end이면 종료
while(tp != tailp){ //tp가 끝까지 돈다.
if(strcmp(temp,tp->name) == 0){ //같은 이름을 찾는다.
printf("@ %s씨는 %3d번째 사람입니다. \n",tp->name,count);
temp1++; //같은이름이 있으면 temp1증가
}
count++; //못찾으면 카운터가 증가 대면서 몇번째인지 파악
tp = tp->ptr;//한노드 이동
}
if(temp1 == 0){ printf("@ 존재하지 않습니다. \n");} //while루프를 다돌아도 존재안할시
count = 1; //카운터 변수 1로 초기화
temp1 = 0; //temp1이 증가되지않으면 아에 그문자열이없는것 반복을 돌아야대기때문에 다시 0으로 초기화
}
return;
}
void del(){
/*
printf("\n\n\n\n\n\n\n\n\n\n\n");
printf(" 4번 삭제하기 메뉴입니다. \n\n\n\n\n");
printf(" # 아무키나 누르면 주메뉴로 돌아갑니다. \n\n\n\n");
getch();
*/
char temp[20]; //입력받을 이름저장 공간
char ch;
int temp1=0;
while (1){ //마직막 빈노드가 아닐시 까지
np = headp;
tp = headp->ptr; // tp,np 초기화 상태 무한루프 동안에
printf("# 삭제할 이름를 입력하세요 : ");
gets(temp); //이름 입력
if(strcmp(temp,"end") == 0){break;} //입력단어가 end이면 종료
while(tp != tailp){ //tp가 끝까지 돈다.
if(strcmp(temp,tp->name) == 0){ //같은 이름을 찾는다.
temp1++; //같은이름이 있으면 temp1증가
printf("#정말로 삭제 하시겠습니까? (Y/N) : "); //진짜 삭제할지 물어봄
ch = getche();
if(ch =='Y' || ch =='y'){ //삭제하겠다고 하면 누르는 즉시 삭제
np->ptr = tp->ptr;
free(tp);
printf("\n@ 삭제되었습니다. \n"); //삭제를 하고 이loop을 빠져나간다.
break;
}
else{ //Y, y가아닌게 입력댈때 삭제취소
printf("\n@ 삭제가 취소되었습니다. \n");
}
}
np = tp;
tp = tp->ptr;//한노드 이동
}
if(temp1 == 0){ printf("@ 존재하지 않습니다. \n");} //while루프를 다돌아도 존재안할시
temp1 = 0; //temp1이 증가되지않으면 아에 그문자열이없는것 반복을 돌아야대기때문에 다시 0으로 초기화
}
return;
}
void sort() //오름차순 정렬 하는 함수
{
char temp[20]; //임시 저장 구조체 선언
np = headp->ptr;
tp = headp->ptr->ptr; // tp,np 초기화 상태
while(np != tailp){
while(tp != tailp){
if((strcmp (np->name,tp->name)) > 0)
{
strcpy(temp, np->name);
strcpy(np->name, tp->name);
strcpy(tp->name, temp);
}
tp = tp->ptr;//np는가만히 있고 tp가 돌고
}
np = np->ptr;// np한노드 이동
tp = np->ptr;// tp가 np의다음노드를 가리킴
}
}
void insert() //삽입함수
{
sort(); //우선 정렬 정렬이 안대있을수도 있기때문에
if(headp->ptr==tailp){ // 노드가 생성되지 않았다면 주메뉴로 돌아감
printf("* 링크드 리스트가 존재 하지 않습니다. [입력하기] 메뉴를 선택하세요.\n");
printf("* 아무키나 누르면 주메뉴로 돌아갑니다.");
getch();
return;
}
int res;
struct Node *Nptr; //임시 저장 노드 생성 삽입시 중간에 낑겨야대므로 노드가하나 필요
while(1)
{
Nptr = (struct Node*)malloc(sizeof(struct Node)); //새노드 생성
np = headp;
tp = headp->ptr; // tp가 맨처음 이름을 가르킨다 무한루프 동안에
printf("# 추가할 이름를 입력하세요 : ");
gets(Nptr->name); //이름 입력
if(strcmp(Nptr->name,"end") == 0){break;} //입력단어가 end이면 종료
while (tp != NULL){
res = strcmp(tp->name, Nptr->name);
if(res > 0){
Nptr->ptr=tp;
np->ptr = Nptr;
break; //오름차순으로 정렬대어 있기 때문에 처음 으로 자기보다 큰수가 나올때 낑겨놓고 나온다.
}
np = tp;
tp = tp->ptr;//한노드 이동
}
}
}
void initList()
{
headp = (struct Node*)malloc(sizeof(struct Node)); //비어있는 노드를 앞뒤로 생성
tailp = (struct Node*)malloc(sizeof(struct Node));
headp->ptr = tailp;
tailp->ptr = tailp;
}
void allDeleteList()
{
tp = headp->ptr;
np = headp;
while (tp != tailp){
np->ptr = tp->ptr; //다음노드만 때어서
free(tp); //메모리 반환하고
np = headp;
tp = headp->ptr; //다시 tp가 다음에 올노드를 가리키게 해서 반복 삭제
}
}
댓글 없음:
댓글 쓰기