C通讯录文件版

这个版本的通讯录多了文件操作功能,使用的是C库函数,fopen,fclose,fgetc,fscanf和fprintf,实现了通讯录记录的读取与保存功能。

程序如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


//声明联系人结构体
typedef struct contact
{
char name[20];
char telnum[20];
char sex[20];
char id[20];
struct contact * next;
struct contact * prev;
}Contact;
typedef Contact * CtLink;


void menu();//主菜单
void choice();//选择功能
void create_empty_contacts(CtLink * head);//建立空的通讯录
void create_newcontact(CtLink * new_contact);//创建新的联系人
void is_malloc_ok(CtLink new_contact);//内存是否分配成功
void add_contact();//添加菜单函数
void search_contact();//查询联系人菜单
void search_name();//按姓名查询
void search_telnum();//按电话号码查询
void edit_contact();//修改联系人菜单
void edit_name();//按名字查询修改
void edit_telnum();//按电话号码查询修改
void delete_contact();//删除联系人菜单
void delete_name();//按姓名查询删除
void delete_telnum();//按电话号码查询删除
void display_contacts();//显示所有联系人
void insert_contact_sort(CtLink new_contact,char * name);//按姓名首字母排序联系人
void free_contacts();//清空通讯录
void load_contacts();
void save_contacts();


CtLink head = NULL;//定义一个全局头指针


//主菜单
int main()
{
create_empty_contacts(&head);
load_contacts();
choice();
save_contacts();
free_contacts();
return 0;
}


//建立空通讯录
void create_empty_contacts(CtLink * head)
{
create_newcontact(head);
(*head)->next = (*head)->prev = *head;
}


//创建新联系人
void create_newcontact(CtLink * new_contact)
{
*new_contact = (CtLink)malloc(sizeof(Contact));
is_malloc_ok(*new_contact);
}


//内存是否分配成功
void is_malloc_ok(CtLink new_contact)
{
if (new_contact == NULL)
{
printf("malloc error!\n");
exit(-1);
}
}


//主菜单
void menu()
{
printf("|-----------------------------欢迎使用煜D通讯录管理系统---------------------------|\n");
printf("|-----------------------------输入1~5选择功能 输入q退出---------------------------|\n");
printf("|-----------------------------(1)添加联系人---------------------------------------|\n");
printf("|-----------------------------(2)查询联系人---------------------------------------|\n");
printf("|-----------------------------(3)修改联系人---------------------------------------|\n");
printf("|-----------------------------(4)删除联系人---------------------------------------|\n");
printf("|-----------------------------(5)显示联系人---------------------------------------|\n");
printf("|-----------------------------(q)退出---------------------------------------------|\n");
}


//功能选择
void choice()
{
char selection;
menu();
printf("请选择你需要的服务(enter 0 to 5):");
scanf("%c", &selection);
while (selection != 'q')
{
getchar();
switch (selection)
{
case '1':add_contact(); getchar();
break;
case '2':search_contact(); getchar();
break;
case '3':edit_contact(); getchar();
break;
case '4':delete_contact(); getchar();
break;
case '5':display_contacts();
break;
default:printf("请输入正确的选项!\n");
break;
}
system("cls");
menu();
printf("请选择你需要的服务(enter 0 to 5):");
scanf("%c", &selection);
}
printf("bye!\n");
}


//添加联系人
void add_contact()
{
char selection;
int num,i;
CtLink new_contact = NULL;
selection = 'y';
printf("|--------------------------欢迎使用添加联系人功能---------------------------------|\n");
while (selection == 'y')
{
printf("请输入要添加的人数:\n");
scanf("%d", &num);
for (i = 0; i < num; i++)
{
create_newcontact(&new_contact);
printf("请输入第%d个联系人的姓名:\n", i + 1);
scanf("%s", new_contact->name);
printf("请输入第%d个联系人的电话:\n", i + 1);
scanf("%s", new_contact->telnum);
printf("请输入第%d个联系人的性别:\n", i + 1);
scanf("%s", new_contact->sex);
printf("请输入第%d个联系人的身份:\n", i + 1);
scanf("%s", new_contact->id);
insert_contact_sort(new_contact, new_contact->name);
}
getchar();
printf("数据添加完成 是否继续添加(y/n):");
scanf("%c", &selection);
}
printf("返回主菜单\n");
system("cls");
}


//按姓名首字母排序联系人
void insert_contact_sort(CtLink new_contact,char * name)
{
CtLink p;
p = head->next;
while (p != head &&  strcmp(name,p->name)>0)
{
p = p->next;
}
new_contact->next = p;
new_contact->prev = p->prev;
p->prev->next = new_contact;
p->prev = new_contact;
}


//显示所有联系人
void display_contacts()
{
CtLink p;
p = head->next;
int i;
i = 1;
printf("|--------------------------欢迎使用显示联系人功能---------------------------------|\n");
if (head->next == head)
{
printf("通讯录中没有记录!\n");
}
else
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
while (p != head)
{
printf("       %2d   %10s     %10s     %1s    %10s \n", i, p->name, p->telnum, p->sex, p->id);
i++;
p = p->next;
}
printf("所有联系人显示完毕!\n");
}
getchar();
system("cls");
}


//查询联系人菜单
void search_contact()
{
char selection;
printf("|--------------------------欢迎使用查询联系人功能---------------------------------|\n");
printf("|--------------------------(1)按姓名查找------------------------------------------|\n");
printf("|--------------------------(2)按电话号码查找--------------------------------------|\n");
printf("|--------------------------(q)退出------------------------------------------------|\n");
printf("请选择你需要的服务(enter 1 to 2):");
scanf("%c", &selection);
while (selection != 'q')
{
switch (selection)
{
case '1':search_name(); getchar();
break;
case '2':search_telnum(); getchar();
break;
default:printf("请输入正确的选项!\n");
break;
}
printf("请选择你需要的服务(enter 1 to 2):");
scanf("%c", &selection);
}
printf("返回主菜单\n");
}


//按名字查询
void search_name()
{
char name[20];
CtLink p;
int i;
i = 0;
p = head->next;
printf("|------------------------欢迎使用按姓名查询联系人功能-----------------------------|\n");
printf("请输入要查找联系人的姓名:");
scanf("%s", name);
while (p != head)
{
if (strcmp(name, p->name) == 0)
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
printf("       %2d   %10s     %10s     %1s    %10s \n", i + 1, p->name, p->telnum, p->sex, p->id);
i++;
}
p = p->next;
}
if (i == 0)
{
printf("没有找到!\n");
}
system("pause");
}


//按电话号码查询
void search_telnum()
{
char telnum[20];
CtLink p;
int i;
p = head->next;
i = 0;
printf("|------------------------欢迎使用按电话号码查询联系人功能-----------------------------|\n");
printf("请输入要查找联系人的电话号码:");
scanf("%s", telnum);
while (p != head)
{
if (strcmp(telnum, p->telnum) == 0)
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
printf("       %2d   %10s     %10s     %1s    %10s \n", i+1, p->name, p->telnum, p->sex, p->id);
i++;
}
p = p->next;
}
if (i == 0)
{
printf("没有找到!\n");
}
system("pause");
}


//修改联系人菜单
void edit_contact()
{
char selection;
printf("|--------------------------欢迎使用修改联系人功能---------------------------------|\n");
printf("|--------------------------(1)按姓名查找------------------------------------------|\n");
printf("|--------------------------(2)按电话号码查找--------------------------------------|\n");
printf("|--------------------------(q)退出------------------------------------------------|\n");
printf("请选择你需要的服务(enter 1 to 2):");
scanf("%c", &selection);
while (selection != 'q')
{
switch (selection)
{
case '1':edit_name(); getchar();
break;
case '2':edit_telnum(); getchar();
break;
default:printf("请输入正确的选项!\n");
break;
}
printf("请选择你需要的服务(enter 1 to 2):");
scanf("%c", &selection);
}
printf("返回主菜单\n");
}


//按姓名查询修改联系人
void edit_telnum()
{
char telnum[20];
char selection;
char arr[20];
CtLink p;
int i;
i = 0;
p = head->next;
printf("|------------------------欢迎使用按电话号码查询联系人功能-----------------------------|\n");
printf("请输入要查找联系人的电话号码:");
scanf("%s", telnum);
getchar();
while (p != head)
{
if (strcmp(telnum, p->telnum) == 0)
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
printf("       %2d   %10s     %10s     %1s    %10s \n", i + 1, p->name, p->telnum, p->sex, p->id);
i++;
printf("|--------------------------欢迎使用修改联系人功能---------------------------------|\n");
printf("|--------------------------(1)修改姓名------------------------------------------|\n");
printf("|--------------------------(2)修改电话号码--------------------------------------|\n");
printf("|--------------------------(3)修改性别--------------------------------------|\n");
printf("|--------------------------(4)修改身份--------------------------------------|\n");
printf("|--------------------------(q)退出------------------------------------------------|\n");
printf("请选择你需要的服务(enter 1 to 4):");
scanf("%c", &selection);
getchar();
while (selection != 'q')
{
switch (selection)
{
case '1':
printf("请输入要修改的名字:");
scanf("%s", arr);
strcpy(p->name, arr);
getchar();
break;
case '2':
printf("请输入要修改的电话号码:");
scanf("%s", arr);
strcpy(p->telnum, arr);
getchar();
break;
case '3':
printf("请输入要修改的性别:");
scanf("%s", arr);
strcpy(p->sex, arr);
getchar();
break;
case '4':
printf("请输入要修改的身份:");
scanf("%s", arr);
strcpy(p->id, arr);
getchar();
break;
default:printf("请输入正确的选项!\n");
break;
}
printf("请选择你需要的服务(enter 1 to 4):");
scanf("%c", &selection);
}
}
p = p->next;
}
if (i == 0)
{
printf("没有找到!\n");
}
system("pause");
}


//按电话号码查询修改联系人
void edit_name()
{
char name[20];
char selection;
char arr[20];
CtLink p;
int i;
i = 0;
p = head->next;
printf("|------------------------欢迎使用按姓名查询联系人功能-----------------------------|\n");
printf("请输入要查找联系人的姓名:");
scanf("%s", name);
getchar();
while (p != head)
{
if (strcmp(name, p->name) == 0)
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
printf("       %2d   %10s     %10s     %1s    %10s \n", i + 1, p->name, p->telnum, p->sex, p->id);
i++;
printf("|--------------------------欢迎使用修改联系人功能---------------------------------|\n");
printf("|--------------------------(1)修改姓名------------------------------------------|\n");
printf("|--------------------------(2)修改电话号码--------------------------------------|\n");
printf("|--------------------------(3)修改性别--------------------------------------|\n");
printf("|--------------------------(4)修改身份--------------------------------------|\n");
printf("|--------------------------(q)退出------------------------------------------------|\n");
printf("请选择你需要的服务(enter 1 to 4):");
scanf("%c", &selection);
getchar();
while (selection != 'q')
{
switch (selection)
{
case '1':
printf("请输入要修改的名字:");
scanf("%s", arr);
strcpy(p->name, arr);
getchar();
break;
case '2':
printf("请输入要修改的电话号码:");
scanf("%s", arr);
strcpy(p->telnum, arr);
getchar();
break;
case '3':
printf("请输入要修改的性别:");
scanf("%s",arr );
strcpy(p->sex ,arr);
getchar();
break;
case '4':
printf("请输入要修改的身份:");
scanf("%s", arr);
strcpy(p->id, arr);
getchar();
break;
default:printf("请输入正确的选项!\n");
break;
}
printf("请选择你需要的服务(enter 1 to 4):");
scanf("%c", &selection);
}
}
p = p->next;
}
if (i == 0)
{
printf("没有找到!\n");
}
system("pause");
}


//删除联系人菜单
void delete_contact()
{
char selection;
printf("|--------------------------欢迎使用删除联系人功能---------------------------------|\n");
printf("|--------------------------(1)按姓名查找------------------------------------------|\n");
printf("|--------------------------(2)按电话号码查找--------------------------------------|\n");
printf("|--------------------------(q)退出------------------------------------------------|\n");
printf("请选择你需要的服务(enter 1 to 2):");
scanf("%c", &selection);
while (selection != 'q')
{
switch (selection)
{
case '1':delete_name(); getchar();
break;
case '2':delete_telnum(); getchar();
break;
default:printf("请输入正确的选项!\n");
break;
}
printf("请选择你需要的服务(enter 1 to 2):");
scanf("%c", &selection);
}
printf("返回主菜单\n");
}


//按姓名查询删除联系人
void delete_name()
{
char name[20];
CtLink p;
int i;
char ch;
i = 0;
p = head->next;
printf("|------------------------欢迎使用按姓名查询联系人功能-----------------------------|\n");
printf("请输入要查找联系人的姓名:");
scanf("%s", name);
while (p != head)
{
if (strcmp(name, p->name) == 0)
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
printf("       %2d   %10s     %10s     %1s    %10s \n", i + 1, p->name, p->telnum, p->sex, p->id);
i++;
getchar();
printf("是否删除该联系人?(y/n)");
scanf("%c", &ch);
if (ch == 'y')
{
p->next->prev = p->prev;
p->prev->next = p->next;
free(p);
break;
}
else
p = p->next;
}
else
{
p = p->next;
}
}
if (i == 0)
{
printf("没有找到!\n");
}
system("pause");
}


//按电话号码查询删除联系人
void delete_telnum()
{
char telnum[20];
CtLink p;
int i;
char ch;
p = head->next;
i = 0;
printf("|------------------------欢迎使用按电话号码查询联系人功能-----------------------------|\n");
printf("请输入要查找联系人的电话号码:");
scanf("%s", telnum);
while (p != head)
{
if (strcmp(telnum, p->telnum) == 0)
{
printf("|------编号-------姓名------电话号码------性别-------身份-------------------------|\n");
printf("       %2d   %10s     %10s     %1s    %10s \n", i + 1, p->name, p->telnum, p->sex, p->id);
i++;
getchar();
printf("是否删除该联系人?(y/n)");
scanf("%c", &ch);
if (ch == 'y')
{
p->next->prev = p->prev;
p->prev->next = p->next;
free(p);
break;
}
else
p = p->next;
}
else
{
p = p->next;
}
}
if (i == 0)
{
printf("没有找到!\n");
}
system("pause");
}


//清空通讯录
void free_contacts()
{
CtLink p;
p = head->next;
if (head->next == head)
{
printf("contacts is empty,release error!\n");
return;
}
while (p != head)
{
p->prev->next = p->next;
p->next->prev = p->prev;
free(p);
p = head->next;
}
printf("release success!\n");
}


void load_contacts()
{
FILE * fp;
char ch;
char buf[20];
int i;
i = 0;
CtLink new_contact = NULL;
if ((fp = fopen("contacts.txt", "r")) == NULL)
{
printf("contacts.txt open error!\n");
exit(-1);
}
while ((ch = fgetc(fp)) != EOF)
{
if (ch == ' ')
{
create_newcontact(&new_contact);
fscanf(fp, "%s", buf);
strcpy(new_contact->name, buf);
fscanf(fp, "%s", buf);
strcpy(new_contact->telnum, buf);
fscanf(fp, "%s", buf);
strcpy(new_contact->sex, buf);
fscanf(fp, "%s", buf);
strcpy(new_contact->id, buf);
insert_contact_sort(new_contact, new_contact->name);
}
}
fclose(fp);
}


void save_contacts()
{
FILE * fp;
char buf[20];
CtLink p;
p = head->next;
if ((fp = fopen("contacts.txt", "w")) == NULL)
{
printf("contacts.txt open error!\n");
exit(-1);
}
while (p != head)
{
fputc(' ', fp);
strcpy(buf, p->name);
fprintf(fp, "%s", buf);
fputc(' ', fp);
strcpy(buf, p->telnum);
fprintf(fp, "%s", buf);
fputc(' ', fp);
strcpy(buf, p->sex);
fprintf(fp, "%s", buf);
fputc(' ', fp);
strcpy(buf, p->id);
fprintf(fp, "%s", buf);
fputc('\n', fp);
p = p->next;
}
fclose(fp);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值