Native/C
[C로 배우는 알고리즘] Namecard
aucd29
2013. 10. 2. 18:51
#include <stdio.h>
//nclude <alloc.h>
#include <stdlib.h>
#include <string.h>
#define NAME_SIZE 21
#define CORP_SIZE 31
#define TEL_SIZE 16
#define REC_SIZE (NAME_SIZE + CORP_SIZE + TEL_SIZE)
typedef struct _card
{
char name[NAME_SIZE];
char corp[CORP_SIZE];
char tel[TEL_SIZE];
struct _card *next;
} card;
card *head, *tail;
void init_card(void)
{
head = (card*)malloc(sizeof(card));
tail = (card*)malloc(sizeof(card));
tail->next = tail;
tail->next = tail;
}
void input_card(void)
{
card *t;
t = (card*)malloc(sizeof(card));
printf("\nInput namecard menu : ");
printf("\n Input name -> ");
gets(t->name);
printf("\n Input corporation : ");
gets(t->corp);
printf("\n Input telephone : ");
gets(t->tel);
t->next = head->next;
head->next = t;
}
void print_card(card* t, FILE* f)
{
fprintf(f, "\n%-20s %-30s %-15s",t->name, t->corp, t->tel);
}
void print_header(FILE* f)
{
fprintf(f, "\nName "
"Corporation "
"Telephone number");
fprintf(f, "\n ---------------------------- "
" -------------------------------- "
"----------------");
}
void load_cards(char *s)
{
FILE *fp;
card *t;
card *u;
if((fp = fopen(s, "rb")) == NULL)
{
printf("\n Error : %s is not exist. ", s);
return;
}
t = head->next;
while(t != tail)
{
u = t;
t = t->next;
free(u);
}
head->next = tail;
while(1)
{
t = (card*)malloc(sizeof(card));
if(!fread(t, REC_SIZE, 1, fp))
{
free(t);
break;
}
t->next = head->next;
head->next = t;
}
fclose(fp);
}
void save_cards(char* s)
{
FILE* fp;
card* t;
if((fp = fopen(s, "wb")) == NULL)
{
printf("\n Error : Disk write failure. ");
return;
}
t = head->next;
while(t!=tail)
{
fwrite(t, REC_SIZE, 1, fp);
t = t->next;
}
fclose(fp);
}
int delete_card(char* s)
{
card* t;
card* p;
p = head;
t = p->next;
while(strcmp(s, t->name) != 0 && t != tail)
{
p = p->next;
t = p->next;
}
if(t == tail)
return 0;
p->next = t->next;
free(t);
return 1;
}
card* search_card(char* s)
{
card* t;
t = head->next;
while(strcmp(s, t->name) != 0 && t != tail)
t = t->next;
if(t == tail)
return NULL;
else
return t;
}
int select_menu(void)
{
int i;
char s[10];
printf("\n\nNAMECARD Manager");
printf("\n-------------------------------------------------");
printf("\n1. Input Namecard");
printf("\n2. Delete Namecard");
printf("\n3. Search Namecard");
printf("\n4. Load Namecard");
printf("\n5. Save Namecard");
printf("\n6. List Namecard");
printf("\n7. Print Namecard");
printf("\n8. End Namecard");
do
{
printf("\n\n : select operation -> ");
i = atoi(gets(s));
}
while(i < 0 || i > 8);
return i;
}
void main(void)
{
char *fname = "NAMECARD.DAT";
char name[NAME_SIZE];
int i;
card *t;
init_card();
while((i = select_menu()) != 8)
{
switch(i)
{
case 1: input_card();
break;
case 2: printf("\n Input name to delete -> ");
gets(name);
if(!delete_card(name))
printf("\n Can't find that name.");
break;
case 3: printf("\n Input name to search -> ");
gets(name);
t = search_card(name);
if(t == NULL)
{
printf("\n Can't find that name.");
break;
}
print_header(stdout);
print_card(t, stdout);
break;
case 4: load_cards(fname);
break;
case 5: save_cards(fname);
break;
case 6: t = head->next;
print_header(stdout);
while(t != tail)
{
print_card(t, stdout);
t = t->next;
}
break;
case 7: t = head->next;
print_header(stdout);
while(t != tail)
{
print_card(t, stdout);
t = t->next;
}
break;
}
}
printf("\n\nProgram ends...");
}
//nclude <alloc.h>
#include <stdlib.h>
#include <string.h>
#define NAME_SIZE 21
#define CORP_SIZE 31
#define TEL_SIZE 16
#define REC_SIZE (NAME_SIZE + CORP_SIZE + TEL_SIZE)
typedef struct _card
{
char name[NAME_SIZE];
char corp[CORP_SIZE];
char tel[TEL_SIZE];
struct _card *next;
} card;
card *head, *tail;
void init_card(void)
{
head = (card*)malloc(sizeof(card));
tail = (card*)malloc(sizeof(card));
tail->next = tail;
tail->next = tail;
}
void input_card(void)
{
card *t;
t = (card*)malloc(sizeof(card));
printf("\nInput namecard menu : ");
printf("\n Input name -> ");
gets(t->name);
printf("\n Input corporation : ");
gets(t->corp);
printf("\n Input telephone : ");
gets(t->tel);
t->next = head->next;
head->next = t;
}
void print_card(card* t, FILE* f)
{
fprintf(f, "\n%-20s %-30s %-15s",t->name, t->corp, t->tel);
}
void print_header(FILE* f)
{
fprintf(f, "\nName "
"Corporation "
"Telephone number");
fprintf(f, "\n ---------------------------- "
" -------------------------------- "
"----------------");
}
void load_cards(char *s)
{
FILE *fp;
card *t;
card *u;
if((fp = fopen(s, "rb")) == NULL)
{
printf("\n Error : %s is not exist. ", s);
return;
}
t = head->next;
while(t != tail)
{
u = t;
t = t->next;
free(u);
}
head->next = tail;
while(1)
{
t = (card*)malloc(sizeof(card));
if(!fread(t, REC_SIZE, 1, fp))
{
free(t);
break;
}
t->next = head->next;
head->next = t;
}
fclose(fp);
}
void save_cards(char* s)
{
FILE* fp;
card* t;
if((fp = fopen(s, "wb")) == NULL)
{
printf("\n Error : Disk write failure. ");
return;
}
t = head->next;
while(t!=tail)
{
fwrite(t, REC_SIZE, 1, fp);
t = t->next;
}
fclose(fp);
}
int delete_card(char* s)
{
card* t;
card* p;
p = head;
t = p->next;
while(strcmp(s, t->name) != 0 && t != tail)
{
p = p->next;
t = p->next;
}
if(t == tail)
return 0;
p->next = t->next;
free(t);
return 1;
}
card* search_card(char* s)
{
card* t;
t = head->next;
while(strcmp(s, t->name) != 0 && t != tail)
t = t->next;
if(t == tail)
return NULL;
else
return t;
}
int select_menu(void)
{
int i;
char s[10];
printf("\n\nNAMECARD Manager");
printf("\n-------------------------------------------------");
printf("\n1. Input Namecard");
printf("\n2. Delete Namecard");
printf("\n3. Search Namecard");
printf("\n4. Load Namecard");
printf("\n5. Save Namecard");
printf("\n6. List Namecard");
printf("\n7. Print Namecard");
printf("\n8. End Namecard");
do
{
printf("\n\n : select operation -> ");
i = atoi(gets(s));
}
while(i < 0 || i > 8);
return i;
}
void main(void)
{
char *fname = "NAMECARD.DAT";
char name[NAME_SIZE];
int i;
card *t;
init_card();
while((i = select_menu()) != 8)
{
switch(i)
{
case 1: input_card();
break;
case 2: printf("\n Input name to delete -> ");
gets(name);
if(!delete_card(name))
printf("\n Can't find that name.");
break;
case 3: printf("\n Input name to search -> ");
gets(name);
t = search_card(name);
if(t == NULL)
{
printf("\n Can't find that name.");
break;
}
print_header(stdout);
print_card(t, stdout);
break;
case 4: load_cards(fname);
break;
case 5: save_cards(fname);
break;
case 6: t = head->next;
print_header(stdout);
while(t != tail)
{
print_card(t, stdout);
t = t->next;
}
break;
case 7: t = head->next;
print_header(stdout);
while(t != tail)
{
print_card(t, stdout);
t = t->next;
}
break;
}
}
printf("\n\nProgram ends...");
}