分享<通讯录>程序vc编写通过
#include<stdio.h>#include<stdlib.h>
#include<string.h>
//********************************************
typedef struct person //通讯录结构中结点的定义
{
char name[10]; //姓名
char addr[30]; //地址
char offphnum[15]; //办公电话
char hmphnum[15]; //家庭电话
char mbphnum[15]; //移动电话
struct person *next;
}listnode,*listlink;
//********************************************
struct add_person //通讯录记录结构
{
char name[10]; //姓名
char addr[30]; //地址
char offphnum[15]; //办公电话
char hmphnum[15]; //家庭电话
char mbphnum[15]; //移动电话
};
//******************函数声明******************
listlink readfp(); //将文件的信息读出并转存到链表中
listlink create(); //建立通讯录
void show(listlink head); //显示所有的信息
void Delete(listlink head); //删除一条记录的信息
void Find(listlink head); //查找记录
void Iuput(listlink head); //向通讯录追加一条个人信息
void Alter(listlink head); //修改一个人信息
void Save(listlink head); //保存信息
//********************************************
main()
{
listlink head=NULL; //设置链表头结点为空
int sel;
head=readfp(); // 将文件的信息读出并转存到链表中
if(head==NULL)
head=create(); //为空,记录通讯录首条信息
do
{
printf("\n\n\t\t 欢迎使用通讯录");
printf("\n\t\t 1.显示所有信息 2.删除一条信息");
printf("\n\t\t 3.查找一条信息 4.追加一条信息");
printf("\n\t\t 5.修改一条信息");
printf("\n\t\t 0.保存并退出");
printf("\n\t\t 请输入(0-5)选择:");
scanf("%d",&sel); //读取输入的选择数字
printf("\n");
switch(sel)
{
case 1:
show(head); //显示所有信息
break;
case 2:
Delete(head); //删除一条信息
break;
case 3:
Find(head); //查找一条信息
break;
case 4:
Iuput(head); //追加一条信息
break;
case 5:
Alter(head); //修改一条信息
break;
case 0:
Save(head); //保存并退出
break;
}
}while(1);
}
//*************将文件的信息读出并转存如链表中************
listlink readfp()
{
FILE *fp; //定义文件指针
struct add_person persons;
listnode *s;
listlink head=NULL,end=NULL;
fp=fopen("people.txt","rb");
if(fp==NULL)
{
printf("不能打开文件\n");
return head;
}
fread(&persons,sizeof(struct add_person),1,fp);
while(!feof(fp))
{
s=(listnode*)malloc(sizeof(listnode));
strcpy(s->name,persons.name);
strcpy(s->addr,persons.addr);
strcpy(s->offphnum,persons.offphnum);
strcpy(s->hmphnum,persons.hmphnum);
strcpy(s->mbphnum,persons.mbphnum);
s->next=NULL;
if(head==NULL)
head=end=s;
else
{
end->next=s;
end=s;
}
fread(&persons,sizeof(struct add_person),1,fp);
}
return head;
}
//**********建立通讯录,并将信息存入文件************************
listlink create()
{
listlink s;
listlink head=NULL,end=NULL;
while(1)
{
s=(listlink)malloc(sizeof(listnode));
printf("\n\t 建立通讯录\n");
printf("\n\n\t 姓名:('#'结束)\n\t 姓名:");
scanf("%s",s->name);
if(strcmp(s->name,"#")==0)
break;
printf("\n 地址:\t 办公电话:\t 家庭电话:\t 移动电话:\n");
scanf("%s %s %s %s",s->addr,s->offphnum,s->hmphnum,s->mbphnum);
s->next=NULL;
if(head==NULL)
head=end=s;
else
{
end->next=s;
end=s;
}
}
return(head);
}
//********************显示所有的信息*******************************
void show(listlink head)
{
listnode *p1;
p1=head;
while(p1!=NULL)
{
printf("%s\t",p1->name);
printf("%s\t",p1->addr);
printf("%s\t",p1->offphnum);
printf("%s\t",p1->hmphnum);
printf("%s\n",p1->mbphnum);
p1=p1->next;
}
}
//*******************删除一条记录的信息******************************
void Delete(listlink head)
{
listlink p1,p2;
char name1[10];
p1=p2=head;
if(p1==NULL)
{
printf("没有记录\n");
return;
}
printf("\n 请输入要删除的名字:");
scanf("%s",name1); //读取输入的名字
while(strcmp(p1->name,name1)!=0&&p1->next!=NULL) //查找没结束
{
p2=p1;
p1=p1->next;
}
if(strcmp(p1->name,name1)==0) //判断输入的名字是否存在
{
if(p1==head)
p1=p1->next;
else
p2->next=p1->next;
free(p1);
}
else
printf(" 要删除的记录不存在!\n");
}
//*******************查找指定记录信息的函数********************
void Find(listlink head)
{
listlink p1;
char name1[10];
while(1)
{
p1=head;
printf("\n 输入查找人的名字:('#'结束)\n 姓名:");
scanf("%s",name1);
if(strcmp(name1,"#")==0)
return;
while(strcmp(name1,p1->name)!=0&&p1->next!=NULL)
p1=p1->next;
if(strcmp(name1,p1->name)!=0)
printf("\n 不存在这个记录!");
else
{
printf("\t 姓名:%s",p1->name);
printf("\t 地址:%s",p1->name);
printf("\t 办公电话:%s",p1->offphnum);
printf("\t 家庭电话:%s",p1->hmphnum);
printf("\t 移动电话:%s\n",p1->mbphnum);
}
}
}
//****************向通讯录追加一条个人信息*******************
void Iuput(listlink head)
{
listlink s,end;
s=(listlink)malloc(sizeof(listnode));
do
{
printf("\n\t 追加一条个人信息!\n\t 姓名:('#'结束)\n\t 姓名:");
scanf("%s",s->name);
if(strcmp(s->name,"#")==0)
return;
end=head;
if(end==NULL)
break;
while((strcmp(end->name,s->name)!=0)&&end->next!=NULL)
end=end->next;
}while(strcmp(end->name,s->name)==0);
printf("\n 地址:\t 办公电话:\t 家庭电话:\t 移动电话\n");
scanf("%s %s %s %s",s->addr,s->offphnum,s->hmphnum,s->mbphnum);
s->next=NULL;
end->next=s;
}
//*****************修改一个人信息***************************
void Alter(listlink head)
{
listlink p1;
char name1[10],phnum1[15],phnum2[15],phnum3[15],add1[30];
printf("\n 输入要修改人的名字:");
scanf("%s",name1);
p1=head;
while(strcmp(name1,p1->name)!=0&&p1->next!=NULL)
p1=p1->next;
if(strcmp(name1,p1->name)!=0)
{
printf("\n 记录不存在!");
return;
}
else
{
printf("\n 输入要修改人的新信息!");
printf("\n 地址:\t 办公电话:\t 家庭电话:\t 移动电话\n");
scanf("%s %s %s %s",add1,phnum1,phnum2,phnum3);
strcpy(p1->name,name1);
strcpy(p1->addr,add1);
strcpy(p1->offphnum,phnum1);
strcpy(p1->hmphnum,phnum2);
strcpy(p1->mbphnum,phnum3);
}
}
//********************保存信息***********************
void Save(listlink head)
{
FILE *fp;
static struct add_person persons;
listlink p1;
fp=fopen("people.txt","wb");
for(p1=head;p1!=NULL;p1=p1->next)
{
strcpy(persons.name,p1->name);
strcpy(persons.addr,p1->addr);
strcpy(persons.offphnum,p1->offphnum);
strcpy(persons.hmphnum,p1->hmphnum);
strcpy(persons.mbphnum,p1->mbphnum);
fwrite(&persons,sizeof(struct add_person),1,fp);
}
fclose(fp);
}