2010년 4월 17일 토요일

동적메모리할당을 이용한 링크드리스트 만들기~

#include
#include
#include //getch() 쓰기위해
#include // cls쓰기위해

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가 다음에 올노드를 가리키게 해서 반복 삭제

}
}

댓글 없음:

댓글 쓰기