<div>#include<stdio.h> //printf,puts,fopen,fwrite,fclose,getchar<br />#include<malloc.h> // malloc,free<br />#include<string.h> // strcpy,stsstr<br />#include<conio.h> // getch</div> <div>#define add1file "J:\\주소록.txt"<br />typedef struct peoplelist<br />{<br />char name[8];<br />char tel[15];<br />char add1[100];<br />char MofW[5];<br />char blood[5];</div> <div>struct peoplelist *prev;<br />struct peoplelist *next;<br />}people;</div> <div>people *addhead = NULL;<br />people *find;</div> <div>int saved = 1; // 1을준이유는 등록 수정 삭제할 때 값이 0이되며, 종료할 때 값이0인 경우 파일에 주소데이터를 모두저장.</div> <div>void get_add1list(void); // 에러시 발생<br />int add_list(const people *add1);<br />int find_list(const char *name);<br />void headposition(void);<br />void tailposition(void);</div> <div>void add_add1(void); //등록<br />void find_add1(void); //검색<br />void modify_add1(void); //수정<br />void d*lete_add1(void); // 삭제<br />void print_add1(void); // 출력<br />void save_add1(void); //저장<br />void remove_add1(void);</div> <div>void main(void)<br />{<br /> int ch;<br /> get_add1list();<br /> <br /> puts(" **********주소록 프로그램**********");</div> <div> while(1) // 무한루프<br /> {<br /> printf("\n\n**********************************************\n");<br /> printf("* [1]등록 [S]저장 *\n");<br /> printf("* [2]검색 [Q]종료 *\n");<br /> printf("* [3]수정 *\n");<br /> printf("* [4]삭제 *\n");<br /> printf("* [5]출력 *\n");<br /> printf("**********************************************\n");<br /> ch = getch();<br /> <br /> switch(ch)<br /> {<br /> case '1' : add_add1(); break;<br /> case '2' : find_add1(); break;<br /> case '3' : modify_add1(); break;<br /> case '4' : d*lete_add1(); break;<br /> case '5' : print_add1(); break;<br /> case 's' :<br /> case 'S' : save_add1(); break;<br /> case 'q' :<br /> case 'Q' :<br /> if(saved == 0)<br /> {<br /> printf("\n\n 변경된 주소 데이터를 저장하시겠습니까? (Y / N)");<br /> ch = getchar();<br /> if(ch =='Y' || ch == 'y')save_add1();<br /> }</div> <div> remove_add1(); return;<br /> default : printf("\n1 ~ 5 또는 S(저장) Q(종료)를 누르십시오.\n"); break;<br /> }<br /> }<br />}</div> <div>void get_add1list(void) //함수선언<br />{<br /> people add1;<br /> FILE *p1;</div> <div> p1 = fopen(add1file,"rb"); // ★★★★★★★★★★★★★★★"주소록", "w"<br /> <br /> if( p1 == NULL )<br /> {<br /> perror("파일 개방 에러");<br /> return;<br /> }</div> <div> while(!feof(p1))<br /> {<br /> fread(&add1,sizeof(people),1,p1);</div> <div> if(ferror(p1))<br /> {<br /> fclose(p1);<br /> perror("파일 읽기 에러");<br /> return;<br /> }</div> <div> if(feof(p1)) break;</div> <div> if(add_list(&add1)==0)<br /> {<br /> printf("주소 데이터를 링크 리스트에 추가 할 수 없습니다.\n");<br /> }<br /> }</div> <div> fclose(p1);<br />}</div> <div><br />int add_list(const people *add1)<br />{<br /> people *plocal, *pv=addhead;</div> <div> headposition();</div> <div> //addhead가 초기화 되지않으면 한 번만 실행.<br /> if(addhead==NULL)<br /> {<br /> plocal=malloc(sizeof(people)); // 구조체에게 할당<br /> memset(plocal,0,sizeof(people));</div> <div> if(plocal == NULL)<br /> {<br /> return 0;<br /> }</div> <div> addhead=plocal;<br /> addhead->prev=NULL;<br /> addhead->next=NULL;<br />}<br />else // addhead가 초기화가 되어도 계속실행<br />{<br /> plocal = malloc(sizeof(people));<br /> memset(plocal,0,sizeof(people));</div> <div> if(plocal == NULL) <br /> {<br /> return 0;<br /> }</div> <div> while(pv->next)<br /> {<br /> pv=pv->next;<br /> }</div> <div> pv->next=plocal;<br /> plocal->prev = pv;<br /> plocal->next=NULL;<br />}</div> <div>strcpy(plocal->name, add1->name);<br />strcpy(plocal->tel, add1->tel);<br />strcpy(plocal->add1,add1->add1);<br />strcpy(plocal->MofW,add1->MofW);<br />strcpy(plocal->blood,add1->blood);</div> <div> return 1;<br />}</div> <div>void headposition(void)<br />{<br /> if(addhead==NULL)return;</div> <div> while(addhead->prev)<br /> {<br /> addhead = addhead->prev;<br /> }<br />}</div> <div>void tailposition(void)<br />{<br /> if(addhead == NULL) return;<br /> <br /> while(addhead->next)<br /> {<br /> addhead = addhead->next;<br /> }<br />}</div> <div>int find_list(const char *name)<br />{<br /> people *plocal;<br /> headposition(); // 첫주소의 데이터를 가리킴</div> <div> plocal = addhead;</div> <div> while(plocal)<br /> {<br /> if(strstr(plocal->name,name))<br /> {<br /> find = plocal;<br /> return 1;<br /> }<br /> plocal = plocal->next;<br /> }<br /> return 0;<br />}</div> <div>void add_add1(void)<br />{<br /> people add1;</div> <div> memset(&add1,0,sizeof(people));</div> <div> printf("\n이 름 :"); gets(add1.name);</div> <div> if(strlen(add1.name) == 0) return;</div> <div> printf("전화번호 :"); gets(add1.tel);<br /> printf("주 소 :"); gets(add1.add1);<br /> printf("성 별 :"); gets(add1.MofW);<br /> printf("혈 액 형 :"); gets(add1.blood);</div> <div> if(find_list(add1.name) == 1)<br /> {<br /> printf("\n이미 등록되어있습니다.\n\n");<br /> puts(find->name);<br /> puts(find->tel);<br /> puts(find->add1);<br /> puts(find->MofW);<br /> puts(find->blood);<br /> return;<br /> }</div> <div> if(add_list(&add1))<br /> {<br /> saved = 0;<br /> printf("\n등록되었습니다.\n\n");<br /> }<br /> else<br /> {<br /> printf("\n등록이 실패되었습니다.\n\n");<br /> }<br />}</div> <div><br />void find_add1(void)<br />{<br /> char buff[100] = {0,};<br /> people *plocal;</div> <div> printf("\n\n검색할 이름/전화/주소/성별/혈액형의 일부를 입력하십시오.\n");<br /> printf("이름/전화/주소/성별/혈액형 :"); gets(buff);</div> <div> if(strlen(buff)==0) return;</div> <div> headposition();</div> <div> plocal = addhead;<br /> find=NULL;</div> <div> while(plocal)<br /> {<br /> if(strstr(plocal->name,buff)) // 이름으로 검색<br /> {<br /> find = plocal;<br /> break;<br /> }<br /> if(strstr(plocal->tel,buff)) // 전화를 검색<br /> {<br /> find=plocal;<br /> break;<br /> }<br /> if(strstr(plocal->add1,buff)) // 주소로검색<br /> {<br /> find=plocal;<br /> break;<br /> }<br /> if(strstr(plocal->MofW,buff)) //성별로 검색<br /> {<br /> find=plocal;<br /> break;<br /> }<br /> if(strstr(plocal->blood,buff)) //혈액형으로 검색<br /> {<br /> find=plocal;<br /> break;<br /> }<br /> <br /> plocal = plocal->next;<br /> }</div> <div> if(find)<br /> {<br /> puts(find->name);<br /> puts(find->tel);<br /> puts(find->add1);<br /> puts(find->MofW);<br /> puts(find->blood);<br /> }<br /> else<br /> {<br /> printf("\n\n%s를 주소록에서 찾을 수 없습니다.\n\n",buff);<br /> }<br />}</div> <div>void modify_add1(void)<br />{<br /> char name[100] = {0,};<br /> people add1;</div> <div> while(1)<br /> {<br /> printf("\n\n수정할 이름 :"); gets(name);</div> <div> if(strlen(name) == 0) return;</div> <div> if(find_list(name) == 0)<br /> {<br /> puts("수정할 이름을 찾을 수 없습니다.");<br /> continue;<br /> }<br /> break; <br /> }<br /> </div> <div><br />printf("\n%s에 대한 주소 데이터는 아래와 같습니다.\n",name);<br />puts(find->name);<br />puts(find->tel);<br />puts(find->add1);<br />puts(find->MofW);<br />puts(find->blood);</div> <div>printf("\n수정하려는 이름/전화/주소/성별/혈액형을 입력 후 엔터키를 치세요.\n");</div> <div>printf("이 름:") ;gets(add1.name);<br />printf("전 화:") ;gets(add1.tel);<br />printf("주 소:") ;gets(add1.add1);<br />printf("성 별:") ;gets(add1.MofW);<br />printf("혈 액 형:") ;gets(add1.blood);</div> <div>if(strlen(add1.name)==0) strcpy(add1.name,name);</div> <div>strcpy(find->name,add1.name);<br />strcpy(find->tel,add1.tel);<br />strcpy(find->add1,add1.add1);<br />strcpy(find->MofW,add1.MofW);<br />strcpy(find->blood,add1.blood);</div> <div>saved = 0;</div> <div>printf("%s에 대한 주소 데이터를 수정하였습니다.\n",name);<br />}</div> <div>void d*lete_add1(void)<br />{<br /> char name[100] ={0,};<br /> people *plocal;<br /> int ch;</div> <div> while(1)<br /> {<br /> printf("\n\n삭제할 이름:"); gets(name);</div> <div> if(strlen(name)==0) return;</div> <div> if(find_list(name)==0)<br /> {<br /> puts("삭제할 이름을 찾을 수 없습니다.");<br /> continue;<br /> }<br /> break;<br /> }<br /> <br /> puts(find->name);<br /> puts(find->tel);<br /> puts(find->add1);<br /> puts(find->MofW);<br /> puts(find->blood);</div> <div> printf("%s을 삭제하겠습니까?(Y/N)",name);<br /> ch = getch();<br /> fflush(stdin);</div> <div> if(ch=='Y' || ch=='y')<br /> {<br /> if(find->prev==NULL)<br /> {<br /> if(find->next==NULL)<br /> {<br /> free(find);<br /> addhead=NULL;<br /> }<br /> else<br /> {<br /> plocal = find->next;<br /> free(find);<br /> plocal->prev=NULL;<br /> addhead=plocal;<br /> }<br /> }<br /> else if(find->next == NULL)<br /> {<br /> plocal = find->prev;<br /> free(find);<br /> plocal->next = NULL;<br /> addhead = plocal;<br /> }<br /> else<br /> {<br /> plocal=find->prev;<br /> plocal->next = find->next;</div> <div> plocal=find->next;<br /> plocal->prev = find->prev;</div> <div> free(find);<br /> addhead = plocal;<br /> }</div> <div> saved = 0;</div> <div> printf("\n검색된 주소 데이터를 삭제하였습니다.\n");<br /> }<br />}</div> <div>void print_add1(void)<br />{<br /> int count =1;</div> <div> people *plocal;</div> <div> headposition();</div> <div> plocal = addhead;</div> <div> while(plocal->prev)<br /> {<br /> plocal = plocal->prev;<br /> }</div> <div> printf("\n\n");</div> <div> while(plocal)<br /> {<br /> printf("번호 : %d\n",count++);<br /> puts(plocal->name);<br /> puts(plocal->tel);<br /> printf("%s\n\n",plocal->add1);</div> <div> printf("아무키나 누르시오.(중지 : Q or q)\n");<br /> if(getch()=='q' || getch()=='Q') return;<br /> <br /> plocal = plocal->next;<br /> }<br />}</div> <div>void save_add1(void)<br />{<br /> people *plocal;<br /> FILE *p1;</div> <div> if(addhead ==NULL) return;</div> <div> p1 = fopen(add1file,"w+b");</div> <div> if(p1==NULL)<br /> {<br /> perror("파일 개방 에러");<br /> return;<br /> }</div> <div> headposition();</div> <div> while(addhead)<br /> {<br /> plocal = addhead->next;</div> <div> fwrite(addhead,sizeof(people),1,p1);</div> <div> addhead = plocal;<br /> }</div> <div> printf("\n모든 데이터를 파일에 저장하였습니다.");</div> <div> saved = 1;</div> <div> fclose(p1);<br />}</div> <div>void remove_add1(void)<br />{<br /> people *plocal;</div> <div> if(addhead == NULL) return;</div> <div> headposition();</div> <div> while(addhead)<br /> {<br /> plocal = addhead->next;</div> <div> free(addhead);</div> <div> addhead = plocal;<br /> }</div> <div> addhead = NULL;<br />}<br />------------------------------</div> <div>구동은 잘되는데 파일 입출력이 문제입니다.</div> <div>메모장에 저장할때 한줄씩 띄워서 저장하고싶은데</div> <div>등록한것 모두가 한줄로 나타납니다.</div> <div>도와주세요 ㅜㅜ</div>
댓글 분란 또는 분쟁 때문에 전체 댓글이 블라인드 처리되었습니다.