/*5.通讯录管理系统(B类)
功能要求:
(1)联系人的增,删,改,查询
(2)使用文件存储信息*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct AddressBook
{
char name[20]; //姓名
int age; //年龄
char sex[5]; //性别
char addr[30]; //地址
int cellphone; //移动电话
int QQ; //QQ或MSN
struct AddressBook *next;
};
void main();
FILE *fp;
struct AddressBook * head=NULL;
void PrintMenu();
struct AddressBook * Create();
void Save();
void Book();
void ReturnBook();
void watch();
void change();
void search();
void search_name();
void search_cellphone();
void main()
{
system("color 9f");
system("title **通讯录**");
printf(" $---------------------------------$\n");
printf(" | |\n");
printf(" | **欢迎进入通讯录管理系统** |\n");
printf(" | |\n");
printf(" $---------------------------------$\n\n");
PrintMenu();
}
void PrintMenu()
{
char i[10];
i[0]='1';
do
{
printf("\n\n"); //打印提示信息
printf(" ★★★★★服务信息★★★★★ \n\n");
printf(" ※1 增加记录(姓名为0结束输入) ※\n");
printf(" ※2 删除记录 ※\n");
printf(" ※3 显示记录 ※\n");
printf(" ※4 查询记录 ※\n");
printf(" ※5 修改记录 ※\n");
printf(" ※0 结束服务 退出系统 ※\n");
printf("请选择按键(0-5):");
scanf("%s",i);
printf("\n\n");
switch(i[0])
{
case '1':
Book();break; //增加记录
case '2':
ReturnBook();break; //删除记录
case '3':
watch();break; //显示记录
case '4':
search();break; //查询记录
case '5':
change();break; //修改记录
case '0':exit(0);
default:
printf("按键错误!请重新按键!\n");
}
}while(i[0]!='0');
}
struct AddressBook * Create()
{
int a;
struct AddressBook * ps;
struct AddressBook * pEnd;
ps=(struct AddressBook *)malloc(sizeof(struct AddressBook)); //给ps开辟空间
head=ps; //把ps 的地址赋给head,链表的首地址
printf("姓名:");
scanf("%s",ps->name);
if(ps->name[0]=='0')
{
PrintMenu();
}
printf("年龄:");
scanf("%d",&ps->age);
printf("性别:");
scanf("%s",ps->sex);
printf("地址:");
scanf("%s",ps->addr);
printf("移动电话:");
scanf("%d",&ps->cellphone);
printf("QQ或MSN:");
scanf("%d",&ps->QQ);
printf("\n\n");
pEnd=ps;
ps=(struct AddressBook *)malloc(sizeof(struct AddressBook));
while(a)
{
printf("姓名:");
scanf("%s",ps->name);
a=ps->name[0];
if(a=='0')break;
pEnd->next=ps;
pEnd=ps;
printf("年龄:");
scanf("%d",&ps->age);
printf("性别:");
scanf("%s",ps->sex);
printf("地址:");
scanf("%s",ps->addr);
printf("移动电话:");
scanf("%d",&ps->cellphone);
printf("QQ或MSN:");
scanf("%d",&ps->QQ);
ps=(struct AddressBook *)malloc(sizeof(struct AddressBook));
printf("\n\n");
}
pEnd->next=NULL;
return head;
}
void Save(struct AddressBook * head1) //保存信息输出到磁盘文件上
{
if((fp=fopen("AddressBook.txt","ab"))==NULL) //ab 追加 向二进制文件尾增加数据
{
return;
}
for(;head1;head1=head1->next)
fwrite(head1,sizeof(struct AddressBook),1,fp);
fclose(fp);
}
void Book()//功能1:增加记录
{
struct AddressBook * head1=Create();
Save(head1);
}
void ReturnBook()//功能2:删除记录
{
char name[20];
int tip=0;
struct AddressBook *tail, *temp=(struct AddressBook *)malloc(sizeof(struct AddressBook));
head=NULL;
if((fp=fopen("AddressBook.txt","rb"))==NULL) //rb 只读 //为输入打开一个二进制文件
{
printf("出错,请检查文件是否存在,按任意键返回主菜单");//出错提示
getchar();
PrintMenu();
}
while((fread(temp,sizeof(struct AddressBook),1,fp))==1)
{
if(head==NULL)
{
head=tail=temp;head->next=NULL;
}
else
{
temp->next=NULL;
tail->next=temp;
tail=temp;
}
temp=(struct AddressBook *)malloc(sizeof(struct AddressBook));
}
fclose(fp);
if(!head)
{
printf("\n数据为空!\n");
return;
}
temp=tail=head;
printf("请输入想删除的姓名:");
scanf("%s",name);
temp=tail=head;
for(;tail;tail=tail->next)
{
if(strcmp(head->name,name)==0)
{
head=tail->next;
printf("你已经成功删除\n");
tip=1;
}
else
if(strcmp(tail->name,name)==0)
{
temp->next=tail->next;
printf("你已经成功删除\n");
tip=1;
}
}
if (tip==0)
{
printf("删除失败! 没有你所查找的信息!\n");
}
if((fp=fopen("AddressBook.txt","wb"))==NULL) //只写 为输出打开一个二进制文件
return;
for(;head;head=head->next)
fwrite(head,sizeof(struct AddressBook),1,fp);
fclose(fp);
}
void watch()//功能3:显示记录
{
//int flag=1;
struct AddressBook *tail, *temp=(struct AddressBook *)malloc(sizeof(struct AddressBook));
head=tail=NULL;
if((fp=fopen("AddressBook.txt","rb"))==NULL)
{
printf("出错,请检查文件是否存在,按任意键返回主菜单\n");//出错提示
main();
}
while((fread(temp,sizeof(struct AddressBook),1,fp))==1)
{
if(head==NULL)
{
head=tail=temp;
head->next=NULL;
}
else
{
temp->next=NULL;
tail->next=temp;
tail=temp;
}
printf("\n");
printf("姓名:%s\n",tail->name);
printf("年龄:%d\n",tail->age);
printf("性别:%s\n",tail->sex);
printf("地址:%s\n",tail->addr);
printf("移动电话:%d\n",tail->cellphone);
printf("QQ/MSN:%d\n",tail->QQ);
temp=(struct AddressBook *)malloc(sizeof(struct AddressBook));
}
if(!head)
{
printf("\n数据为空!\n");
return;
}
free(tail);
free(temp);
fclose(fp);
}
void search() //功能4:查询记录
{
int i;
printf("请选择按键 \n");
printf("\n按姓名查询请按(1),按移动电话查询请按(2),返回请按(0)\n");
scanf("%d",&i);
switch(i)
{
case 1:
search_name();break;
case 2:
search_cellphone();break;
case 0:
PrintMenu();break;
default:
printf("按键错误!请重新按键!\n");
}
PrintMenu();
}
void search_name()//查找姓名
{
char name[20];
int k=0;
struct AddressBook *tail, *temp=(struct AddressBook *)malloc(sizeof(struct AddressBook));
head=NULL;
if((fp=fopen("AddressBook.txt","rb"))==NULL)
{
printf("出错,请检查文件是否存在,按任意键返回主菜单");//出错提示
getchar();
PrintMenu();
}
while((fread(temp,sizeof(struct AddressBook),1,fp))==1)
{
if(head==NULL)
{
head=tail=temp;
head->next=NULL;
}
else
{
temp->next=NULL;
tail->next=temp;
tail=temp;
}
temp=(struct AddressBook *)malloc(sizeof(struct AddressBook));
}
printf("请输入所要查找的姓名:\n");
scanf("%s",name);
if(head==NULL)
{
printf("数据为空!");
PrintMenu();
}
for(;head;head=head->next)
if(strcmp(head->name,name)==0)
{
printf("\n找到相匹配的信息\n");
printf("姓名:%s\n",head->name);
printf("年龄:%d\n",head->age);
printf("性别:%s\n",head->sex);
printf("地址:%s\n",head->addr);
printf("移动电话:%d\n",head->cellphone);
printf("QQ/MSN:%d\n",head->QQ);
k=1;
}
while (!k)
{
printf("没有你所查找的信息!\n");break;
}
free(tail);
free(temp);
fclose(fp);
loop :
printf("\n是否继续? 是请按'1',否请按(0).\n");
scanf("%d",&k);
switch(k)
{
case 1:
search_name();break;
case 0:
PrintMenu();break;
default:
printf("按键错误!请重新按键!\n");
goto loop;break;
}
}
小贝德罗
- 粉丝: 88
- 资源: 1万+
最新资源
- evo-master.zip
- iNode智能客户端官方版是H3C公司自行设计开发出的一款智能客户端软件工具 iNode智能客户端可实现对网络的管理接入,对用户终端进行身份认证等等功能,从而大幅度提高网络的整体安全
- Documents.zip
- caxa电子图板工艺图表补丁文件2025版本
- <项目代码>YOLOv8 无人机航拍红外人车识别<目标检测>
- python股票量化系统源码+文档说明(深度学习量化项目)
- iNode智能客户端官方版是H3C公司自行设计开发出的一款智能客户端软件工具 iNode智能客户端可实现对网络的管理接入,对用户终端进行身份认证等等功能,从而大幅度提高网络的整体安全
- Python自动办公-Python检查word文件中的特殊标记词是否与文件名中的一致
- elasticsearch:7.15.2 docker镜像
- 毕业设计-基于STM32的自动扶梯控制器设计(源码+毕业论文+开题报告)C语言
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
评论0