구조체와 같이 고정적인 길이를 갖는 자료를 디스크에 입출력하기 위한 함수의 선택
-> fread() , fwrite() <stdio.h>
키보드로 자료를 입력 받기 위한 함수의 선택
-> gets()<stdio.h> or cgets() <conio.h>
파일 열기, 닫기 함수
-> fropen(), fclose() <stdio.h>
다른 내용들은 기존에 작성했던 함수들을 그대로 사용하면 된다.
----------------------------------------------------------------------------------------
/*
날짜 : 2006 / 4/ 14
제목 : 명함 관리
적용 알고리즘 : 단순 연결 리스트를 이용한 프로그램
파일 입출력을 이용
*/
#include <stdio.h>
#include <conio.h>
#define NAME_MAX 10
#define COMPANY_MAX 35
#define PLUS_MAX (NAME_MAX + COMPANY_MAX)
/* gets()
키보드로부터 문자열을 입력 받는 함수
ENTER키에 의해 자동적으로 문자열에 종료 문자(NULL)을 붙여준다.
그러나, 입력되는 문자열의 길이를 제한할 수 없는 단점이 있다. 즉,
정해진 문자열의 길이를 넘도록 입력이 되면 에러가 발생
그래서, conio.h 에 있는 cgets()를 사용하면 된다.
// 연결리스트의 디스크 입출력
*/
typedef struct _node
{
char name[NAME_MAX];
char company[COMPANY_MAX];
struct _node *next;
} node;
node *head, *tail;
void init_list();
void show_menu();
void select_job();
void input_card();
void show_list();
void write_card();
void read_card();
void delete_all();
node *search_card();
void delete_card();
void modify_card();
void init_list()
{
head = (node *) malloc(sizeof(node));
tail = (node *) malloc(sizeof(node));
// 단순 연결리스트 이므로
head ->next = tail;
tail->next = tail;
printf("initialize the list,...\n");
}
void show_menu()
{
printf("---------------------------------------------------\n");
printf(" simply linked list test program----------\n");
printf("---------------------------------------------------\n");
printf("------1. input the new name card-------------------\n");
printf("------2. modify the name card----------------------\n");
printf("------3. delete the name card----------------------\n");
printf("------4. search the name card----------------------\n");
printf("------5. delete all!-------------------------------\n");
printf("------6. read the data file -----------------------\n");
printf("------7. write to the data file--------------------\n");
printf("------8. exit--------------------------------------\n");
printf("------0. show the cuurent list---------------------\n");
printf("---------------------------------------------------\n");
printf("---------------------------------------------------\n");
printf("---------------------------------------------------\n\n");
}
void select_job()
{
int m;
printf("select (1 ~ 8) : ");
scanf("%d",&m);
switch(m)
{
case 1: //input
input_card();
break;
case 2: // modify
modify_card();
break;
case 3: // delete
printf("DELETE CARD\n");
delete_card();
break;
case 4: //search
printf("SEARCH CARD\n");
search_card();
break;
case 5: // delete all
delete_all();
break;
case 6: // read the data file
read_card();
break;
case 7: // write to the data file
write_card();
break;
case 8: // exit
exit(-1);
case 0: // show the current list
show_list();
break;
}
}
void delete_card()
{
node *s,*t;
s=search_card(); // 찾은 노드의 앞 원소를 가르키는 포인터를 변수에 저장
if(s!=NULL){
t=s->next; // t는 찾은 노드를 가르킴
s->next = t->next;
free(t);
printf("deleted the card!");
}
else
printf("return to the menu\n");
}
void modify_card()
{
}
node *search_card()
{
char s[PLUS_MAX];
node *t,*n;
n=head;
t=n->next;
printf("input the name for search: ");
scanf("%s",&s);
//printf("DEBUG : %s",s);
while((strcmp(s,t->name)!=0)&& t!=tail)
{
n=n->next;
t=n->next;
}
if(t==tail)
{
printf("cannot find!\n");
return NULL;
}
else
{
printf("here is...%s\n",t->name);
return n; // 찾은 원소의 앞의 포인터를 반환
}
}
void read_card() //읽으면서 하나 일고 하나 삭제하고.....
{
node *n,*s;
FILE *p;
// 파일 열기
if((p=fopen("name_card.txt","rb"))==NULL)
{
printf("\n Error : Disk read failure\n");
return;
}
delete_all(); //메모리상의 기존 모든 값을 삭제
//이제 메모리에 적재하는 일만 남았다.
s=head->next;
while(1)
{
n=(node*)malloc(sizeof(node));
if(!fread(n,PLUS_MAX,1,p))
{
free(n);
break;
}
n->next = head->next;
head->next = n;
}
fclose(p);
}
void delete_all()
{
node *t,*u;
t=head->next;
while(t!=tail)
{
u=t;
t=t->next;
free(u);
}
head->next = tail;
}
void write_card(){
node *n;
FILE *p;
if((p=fopen("name_card.txt","wb"))==NULL)
{
printf("\n Error : Disk write failure\n");
return ;
}
n=head->next;
while(n!=tail)
{
fwrite(n,PLUS_MAX,1,p);
n=n->next;
}
fclose(p);
}
void show_list()
{
node *t;
t=head->next;
printf("----------------------------------------------------------------\n");
printf("-------- show the current list ---------------------------------\n");
printf("----------------------------------------------------------------\n");
while(t!=tail)
{
printf("%s | %s\n",t->name, t->company);
t=t->next;
}
printf("---------------------------------- end of the list -------------\n");
}
void input_card()
{
/*
char name[10];
char company[35];
*/
node *n;
n = (node *)malloc(sizeof(node));
fflush(stdin);
printf("INPUT CARD\n");
printf("new name : ");
gets(n->name);
printf("new company: ");
gets(n->company);
n->next = head->next;
head->next = n;
}
int main()
{
init_list();
while(1)
{
show_menu();
select_job();
}
system("PAUSE");
return 0;
}
'dev, tech > c, c++' 카테고리의 다른 글
스트림(stream) (0) | 2006.04.14 |
---|---|
환형 연결 리스트 (0) | 2006.04.11 |
단순 연결 리스트(Simple Linked List) (0) | 2006.04.07 |
연결리스트 (0) | 2006.04.07 |
<img src="http://blogimgs.naver.com/nblog/ico_scrap01.gif" class="i_scrap" width="50" height="15" alt="본문스크랩" /> 2차원 배열과 포인터 (3) (0) | 2006.04.07 |
댓글