您的位置:首页 > 运维架构 > Linux

电子通讯录(文件保存版)

2017-08-20 10:36 106 查看
        需求
制作一个电子通讯录,通过该通讯录能存入好友ID号、姓名(英文)、手机号码、家庭住址、公司电话。
模块
 主界面:主要显示软件功能。
A) 添加好友信息。                                   //  id为唯一标识
B) 列表好友信息。(包含排序功能)
C) 搜索好友
D) 删除好友
//按姓名查找,如有重名全部列出,让用户选择
E )修改好友信息
//按id查找,修改信息

F)保存通讯录





文件1.h

#ifndef __1_H_
#define __1_H_

#define SIZE (sizeof(struct tongxun)/sizeof(char))
typedef struct tongxun
{
char id[20]; /
4000
/编号
char name[30]; //姓名
char num[20]; //手机号码
char zhuzhi[100]; //住址
char tel[20]; //家庭电话
struct tongxun * next;//下一条信息地址
}T;
//菜单
void caidan();
//创建通讯录信息链表
T * create();
//添加好友信息
void add(T * head);
//排序
void paixu(T*head);
//显示好友信息列表
void display(T * head);
//查找好友
void find(T* head);
//删除好友
void del(T* head);
//修改好友信息
void amend(T* head);

#endif

文件1.c
#include<stdio.h>
#include<string.h>
#include"1.h"
#include<stdlib.h>
int count11=0; //记录通讯录有多少好友
void caidan() //菜单显示
{
printf(" 电子通讯录\n");
printf(" A)添加好友信息.\n");
printf(" B)列表好友信息.(包含排序功能)\n");
printf(" C)搜索好友\n");
printf(" D)删除好友\n");
printf(" E)修改好友信息\n");
printf(" F)退出并保存\n");

}
T * create() //创建链表并如果已有数据赋值
{
FILE* fp;
T* head;
head=(T*)malloc(SIZE);
if(head==NULL)
{
printf("error\n");
return NULL;
}
head->next=NULL;

fp=fopen("1","r");
if(fp==NULL)
{
// printf("open error\n");
return head;
}
T t;
T *p,*p1;
int n;
fread(&n,sizeof(int),1,fp);
count11=n;

int i;
for(i=0;i<n;i++)
{
fread(&t,sizeof(T),1,fp);
p1=head;
while(p1->next)
{
p1=p1->next;
}
p=(T*)malloc(sizeof(T));
p->next=NULL;
strcpy(p->id,t.id);
strcpy(p->name,t.name);
strcpy(p->zhuzhi,t.zhuzhi);
strcpy(p->num,t.num);
strcpy(p->tel,t.tel);
p1->next=p;

}
fclose(fp);
return head;
}
void add(T * head) //添加好友
{
T *p1,*p,*p3;
int leap=0;

p=(T*)malloc(SIZE); //开辟一个空间存储信息
if(p==NULL)
return;
// printf("输入ID(数字),姓名(英文),手机号码,家庭住址,家庭电话\n");
// scanf("%s %s %s %s %s",&p->id,&p->name,&p->num,&p->zhuzhi,&p->tel);
printf("输入ID(数字)\n");
scanf("%s",p->id);
printf("姓名(英文)\n");
scanf("%s",p->name);
printf("手机号码\n");
scanf("%s",p->num);
printf("家庭住址\n");
scanf("%s",p->zhuzhi);
printf("家庭电话\n");
scanf("%s",p->tel);
p1=head;
while(p1->next)
{
if(strcmp(p1->next->id,p->id)==0)
{
leap=1;
break;
}
p1=p1->next;
}
if(leap==1)
{
printf("error id same\n");
return ;

}
p1=head;
while(p1->next)
{
p1=p1->next;
}
p1->next=p;
p->next=NULL;
count11++;
printf("添加成功\n");
}
void paixu(T*head) //按id号从小到大排序
{
T * p,*p1,*p2,*p3;
int i;
int j,k;

for(i=0;i<20-1;i++)
for(p=head;p->next->next!=NULL;p=p->next)
{
j=atoi(p->next->id);
k=atoi(p->next->next->id);
if(j>k)
{
p1=p->next;
p2=p1->next;
p3=p2->next;
p->next=p2;
p2->next=p1;
p1->next=p3;
}
}

}
void display(T * head) //显示好友
{
T *p;
if(head->next==NULL)
{
printf("无好友\n");
return;
}

paixu(head);
p=head->next;
printf("通讯录总共有人%d\n",count11);
printf("ID\t姓名(英文)\t手机号码\t家庭住址\t家庭电话\n");
while(p)
{
printf("%s\t%s\t\t%s\t\t%s\t\t%s\n",p->id,p->name,p->num,p->zhuzhi,p->tel);
p=p->next;
}

}

void find(T* head) //查找好友
{
T*p;
int n,leap=0; //leap为标志为,1说明有此好友,0没有
char name[30];
if(head->next==NULL) //链表为空说明没有好友
{
printf("您没有好友\n");
return;

}
printf("输入姓名查询\n"); //输入姓名查找好友信息
scanf("%s",&name);
p=head->next; //遍历链表
while(p)
{
if(strcmp(name,p->name)==0)
{
leap=1; //标志位为1,找到并退出
break;
}
p=p->next;
}

if(leap==0) //标志为0说明没找到
{
printf("您没有此好友\n");
return;
}
else //否则输出好友信息
{
printf("ID\t姓名(英文)\t手机号码\t家庭住址\t家庭电话\n");
p=head->next;
while(p)
{
if(strcmp(name,p->name)==0)
{
printf("%s\t%s\t\t%s\t\t%s\t\t%s\n",p->id,p->name,p->num,p->zhuzhi,p->tel);
}
p=p->next;
}

}

}
void del(T* head) //删除好友
{
T*p,*p1;
int n=0,leap=0;
char id[20];
char name[30];
if(head->next==NULL) //判断是否有好友
{
printf("您好友列表为空,无需删除\n");
return ;
}
printf("你想删除的姓名:"); //输入姓名删除
scanf("%s",&name);
p=head->next;
while(p!=NULL) //遍历有多少重名的
{
if(strcmp(name,p->name)==0)
{
n++; //n计数重名数量
}
p=p->next;
}
if(n==1) //如果数量为1,遍历找到直接删除
{
p=head;
while(p->next!=NULL)
{
if(strcmp((p->next->name),name)==0)
{
p1=p->next;
p->next=p1->next;
free(p1);
count11--;
printf("删除成功\n");
return;
}
p=p->next;
}
}
else if(n==0) //数量为0说明,通讯录没有此好友
{
printf("您没有此好友\n");

}
else //否则有很多重名,打印输出并让用户判断
{
p=head;
printf("ID\t姓名(英文)\t手机号码\t家庭住址\t家庭电话\n");
while(p->next!=NULL)
{
if(strcmp((p->next->name),name)==0)
{

printf("%s\t%s\t\t%s\t\t%s\t\t%s\n",p->next->id,p->next->name,p->next->num,p->next->zhuzhi,p->next->tel);
}
p=p->next;
}
//让用户输入想删除人的id号
printf("你想删除的ID号:");
scanf("%s",&id);
p=head; //遍历是否有此人
while(p->next)
{
if(strcmp(p->next->id,id)==0&&strcmp((p->next->name),name)==0)
{
leap=1; //标志位leap为1说明有此人,删除并释放空间
p1=p->next;
p->next=p1->next;
free(p1);
break;
}
p=p->next;
}

if(leap==0) //为0没有找到
{
printf("您没有此好友\n");
return;
}
else //如果有提示用户删除成功
{
printf("删除成功\n");
count11--; //成功删除后好友数量减一
}
}
}
void baocun(T *head) //文件保存
{
FILE *fp;
fp=fopen("1","w+");
if(fp==NULL)
{
printf("open error\n");
return;
}
fwrite(&count11,sizeof(int),1,fp);

T* p;
p=head;

if(p->next==NULL)
{
printf("无人,不需写入\n");
fclose(fp);
return ;
}

p=p->next;
while(p)
{
fwrite(p,sizeof(T),1,fp);
p=p->next;

}

printf("保存成功\n");
fclose(fp);
}
void update(T* head)
{
char str[128];
int n;
printf("输入你想修改的好友id号:");
memset(str,0,128);
scanf("%s",str);
if(count11==0)
{
printf("您没有好友,无需修改\n");
return;
}
T* p; //链表遍历,找到就提前退出
p=head;
p=head->next;
while(p)
{
if(strcmp(p->id,str)==0)
break;
p=p->next;
}
if(p==NULL) //没找到,提示用户
{
printf("您没有此好友\n");
return;
}
//屏幕打印输出用户需要修改的好友原来信息
printf("此好友信息为\n");
printf("ID\t姓名(英文)\t手机号码\t家庭住址\t家庭电话\n");
printf("%s\t%s\t\t%s\t\t%s\t\t%s\n",p->id,p->name,p->num,p->zhuzhi,p->tel);

while(1)
{
printf(" 1.修改姓名输入\n");
printf(" 2.修改手机号码\n");
printf(" 3.修改家庭住址\n");
printf(" 4.修改家庭电话\n");
printf(" 5.不修改了\n");
scanf("%d",&n);
if(n==1) //修改此好友姓名
{
printf("请输入修改后的姓名:");
memset(str,0,128);
scanf("%s",str);
strcpy(p->name,str);
printf("姓名修改成功\n");
}
else if(n==2) //修改此好友手机号码
{
printf("请输入修改后的号码:");
memset(str,0,128);
scanf("%s",str);
strcpy(p->num,str);
printf("手机号码修改成功\n");
}
else if(n==3) //修改此好友家庭住址
{
printf("请输入修改后的住址:");
memset(str,0,128);
scanf("%s",str);
strcpy(p->zhuzhi,str);
printf("家庭住址修改成功\n");
}
else if(n==4) //修改此好友家庭电话
{
printf("请输入修改后的电话:");
memset(str,0,128);
scanf("%s",str);
strcpy(p->zhuzhi,str);
printf("家庭电话修改成功\n");
}
else if(n==5) //退出
return;
}

}
void amend(T* head)//修改好友信息
{
char str[128];
memset(str,0,128);
printf("(需要显示好友信息请输入look,不需要输入nolook)\n");
scanf("%s",str);
if(strcmp(str,"look")==0)
{
display(head);
update(head);
}
else if(strcmp(str,"nolook")==0)
{
update(head);
}
}



文件main.c
#include<stdio.h>
#include<string.h>
#include"1.h"

int main()
{
T * head;
char ch[30],cd;
head=create(); //创建链表
system("clear");
caidan();
while(1)
{
system("clear");
caidan();
printf("你想操作的的功能:");
scanf("%s",&ch);
// fgets(ch,2,stdin);
if(strcmp(ch,"1")==0||strcmp(ch,"A")==0)//添加好友信息
{
add(head);
getchar();
}
else if(strcmp(ch,"2")==0||strcmp(ch,"B")==0)//列表好友信息
{
display(head);
getchar();
}
else if(strcmp(ch,"3")==0||strcmp(ch,"C")==0)//搜索好友
{
display(head);
find(head);
getchar();
}
else if(strcmp(ch,"4")==0||strcmp(ch,"D")==0)//删除好友
{
display(head);
del(head);
getchar();
}
else if(strcmp(ch,"5")==0||strcmp(ch,"E")==0)//修改好友信息
{
amend(head);
getchar();
}
else if(strcmp(ch,"6")==0||strcmp(ch,"F")==0)
{
baocun(head);
printf("欢迎使用谢谢\n");
break;
}
else
{
printf("输入错误,请重新输入\n");
}
getchar();
}
return 0;
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息