就是选择分类的时候本来0是返回上一项菜单的,结果变成新的一类
#include /*标准输入输出函数库*/
#include /*标准函数库*/
#include
#include
FILE *fp;
struct Data
{
int fenlei;
char name[10]; //姓名
char tel[15]; //电话
char age[8]; //年龄
char qq[10]; //QQ号
} ren[1000];
struct Data1
{
struct Data data;
struct Data1 *next;
} *p,*p1,*p2;
struct zhanghao
{
char username[20];
char password[10];
} zh,*zh1,*zh2;
struct LNode
{
char clas[20];
int length;
struct Data1 *next;
} a[6];
int menu() //主菜单选择函数
{
int c; //定义一个整型变量
do
{
system("cls"); //清屏
printf("\t*******通讯录*******\n");
printf("\t--------------------\n");
printf("\t 1、通讯信息显示 \n");
printf("\t 2、通讯信息保存 \n");
printf("\t 3、通讯信息删除 \n");
printf("\t 4、通讯信息修改 \n");
printf("\t 5、通讯信息增加 \n");
printf("\t 6、通讯信息查询 \n");
printf("\t 0. 退出 \n");
printf("\t--------------------\n");
printf("\t请您选择(0-6):");
scanf("%d",&c);
}
while(c>7&&c<0);
return(c);
}
void openclass()
{
FILE *fp1;
int i;
if ((fp1=fopen("contact.dat","r"))==NULL)
{
printf("\n不存在分类类别");
if ((fp1=fopen("contact.dat","w"))==NULL) //不存在则进行创建
{
printf("\n建立失败");
exit(0);
}
strcpy(a[1].clas,"1.家人亲戚"); //依次将下一条信息复制到上一条的位置
strcpy(a[2].clas,"2.朋友");
strcpy(a[3].clas,"3.同学");
strcpy(a[4].clas,"4.同事");
strcpy(a[5].clas,"5.陌生人");
strcpy(a[6].clas,"6.其他");
for (i=1; i<=6; i++)
{
if (fprintf(fp1,"%s\n",a[i].clas)==0)
{
printf("\n文件保存错误!\n");
}
a[i].length=0;
a[i].next=NULL;
}
}
else
{
rewind(fp1);
for (i=1; !feof(fp1) && fscanf(fp1,"%s\n",a[i].clas); i++)a[i].next=NULL;
printf("\n类别文件导入成功\n");
}
fclose(fp1);
//printf("\n按任意键返回主菜单:");
// getch();//按任意键退出
return;
}
int select()
{
int c,i=1;
do
{
printf("\n1.家人亲戚\n");
printf("2.朋友\n");
printf("3.同学\n");
printf("4.同事\n");
printf("5.陌生人\n");
printf("6.其他\n");
printf("0.返回主菜单\n");
printf("请您选择(0-6):");
scanf("%d",&c);
if(c6)
printf("输入错误!请重新输入:\n");
}
while(c<0||c>6);
if (c==0)return;
else return (c);
}
int checkUerValid(struct zhanghao zh1)/校验用户合法性*/
{
FILE*fp;
struct zhanghao zh[1],*zh2=zh;
char *usr,*pwd;
int check=0;
usr=zh1->username;
pwd=zh1->password;
if((fp=fopen("user.dat","rb"))==NULL)
{
printf("File open error!\n");
exit(0);
}
rewind(fp);
fread(zh2,sizeof(struct zhanghao),1,fp);
if((strcmp(usr,zh2->username)==0)&&(strcmp(pwd,zh2->password)==0))
{
check=1;
}
if(fclose(fp))
{
printf("不能关闭文件!\n");
exit(0);
}
return check;
}
void Readfile()
{
int n,i;
openclass();
if((fp=fopen("user.dat","rb"))!=NULL)
{
printf("通讯录文件已存在。\n");
rewind(fp);
fread(&p2,sizeof(struct zhanghao),1,fp);
printf("请输入用户名:");
scanf("%s",zh.username);
printf("请输入密码:");
scanf("%s",zh.password);
while(checkUerValid(&zh)!=1)
{
printf("密码错误,请重新输入:\n");
printf("请输入用户名:");
scanf("%s",zh.username);
printf("请输入密码:");
scanf("%s",zh.password);
}
fclose(fp);
}
if((fp=fopen("catalog.dat","rb"))==NULL)
{
printf("\n通讯录文件不存在!");
if ((fp=fopen("catalog.dat","wb"))==NULL) //不存在则进行创建
{
printf("\n建立失败");
exit(0);
}
else
{
if ((fp=fopen("user.dat","wb"))==NULL) //不存在则进行创建
{
printf("\n建立失败");
exit(0);
}
else
{
printf("\n输入注册号(不大于8位数):");
struct zhanghao zh[1],*zh1=zh;
scanf("%s",zh1->username);
while(strlen(zh1->username)>=8)
{
printf("\n注册号输入错误!请重新输入:");
scanf("%s",zh1->username);
}
printf("\n输入注册号密码(不大于8位数):");
scanf("%s",zh1->password);
while(strlen(zh1->password)>=8)
{
printf("\n注册号输入错误!请重新输入:");
scanf("%s",zh1->password);
}
fwrite(zh1,sizeof(struct zhanghao),1,fp);
}
fclose(fp);
printf("\n通讯录文件已建立\n");
printf("\n按任意键进入主菜单");
getch();
return;
}
exit(0); //退出
}
fseek(fp,0,2); //文件位置指针移动到文件末尾
if (ftell(fp)>0) //文件不为空,获取的是文件长度
{
//rewind(fp); //文件位置指针移动到文件开始位置
fseek(fp,0,0); //文件位置指针移动到文件开始位置
for ( n=0; !feof(fp) && fread(&ren[n],sizeof(struct Data),1,fp); n++);
//for(i=0;i<=n;i++)printf("%s",dat[i].name);
for(i=0; i<=n; i++)
{
p1=a[ren[i].fenlei].next;
p=(struct Data1*)malloc(sizeof(struct Data1));
p->data=ren[i];
p->next=NULL;
if(a[ren[i].fenlei].next==NULL)
{
a[ren[i].fenlei].next=p;
a[ren[i].fenlei].length++;
}
else
{
while(p1->next!=NULL)p1=p1->next;
p1->next=p;
a[ren[i].fenlei].length++;
}
}
//从文件流中读取数据,以Data结构体接收读取的数据,并由n记录下文件中联系人个数
printf("\n文件导入成功\n");
printf("\n按任意键进入主菜单:");
getch();
return;
}
fclose(fp);
printf("\n文件导入成功\n");
printf("\n文件中没有数据\n");
printf("\n按任意键进入主菜单:");
getch();//按任意键退出
return;
}
int input1(struct LNode a[],int n)
{
char s[10];
char ch,m;
while(ch!='n'&&ch!='N')
{
p1=a[n].next;
printf("添加新联系人\n");
printf("姓名:");
p=(struct Data1*)malloc(sizeof(struct Data1));
p->next=NULL;
scanf("%s",s);
if(p1!=NULL)
{
while((strcmp(p1->data.name,s)!=0)&&p1->next!=NULL)
p1=p1->next;
if(strcmp(p1->data.name,s) == 0)
{
printf("通讯录中已有此人!\n");
printf("是否继续添加?(Y/N)");
scanf("%s",&m);
while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&m);
}
if(m!='n'&&m!='N')
{
input1(a,n);
}
return 0;
}
if(p1->next==NULL)
{
printf("电话:");
scanf("%s",p->data.tel);
printf("电子邮件:");
scanf("%s",p->data.age);
printf("QQ号:");
scanf("%s",p->data.qq);
strcpy(p->data.name,s);
printf("类别:%d",n);
p->data.fenlei=n;
p1->next=p;
a[n].length++;
}
}
else
{
printf("电话:");
scanf("%s",p->data.tel);
printf("电子邮件:");
scanf("%s",p->data.age);
printf("QQ号:");
scanf("%s",p->data.qq);
strcpy(p->data.name,s);
printf("类别:%d",n);
p->data.fenlei=n;
a[n].next=p;
a[n].length++;
}
printf("\n是否继续添加?(Y/N)");
scanf("%s",&ch);
while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&ch);
}
}
printf("\n添加成功!\n");
printf("\n按任意键返回主菜单:");
getch();
return 0;
}
void print11(struct LNode a[],int n)
{
int l=1;
if(a[n].length>0)
{
printf("共%d条记录\n",a[n].length);
p1=p=a[n].next;
while(p!=NULL)
{
printf("\n%d\n类别:",l++);
printf("%d\n",p->data.fenlei);
printf("姓名:");
printf("%s\n",p->data.name);
printf("电话:");
printf("%s\n",p->data.tel);
printf("电子邮件:");
printf("%s\n",p->data.age);
printf("QQ:");
printf("%s\n",p->data.qq);
p=p->next;
}
}
else printf("\n名片数为0!\n");
printf("\n按任意键返回主菜单:");
getch();
return;
}
void allprint(struct LNode a[])
{
int n,sum=0,l=0;
for(n=1; n
{
sum=sum+a[n].length;
}
printf("\n一共%d记录",sum);
for(n=1; n
{
if(a[n].length>0)
{
printf("\n类别%d共%d条记录\n",n,a[n].length);
p1=p=a[n].next;
while(p!=NULL)
{
printf("%d\n",p->data.fenlei);
printf("姓名:");
printf("%s\n",p->data.name);
printf("电话:");
printf("%s\n",p->data.tel);
printf("电子邮件:");
printf("%s\n",p->data.age);
printf("QQ:");
printf("%s\n",p->data.qq);
p=p->next;
}
}
else printf("\n名片数为0!\n");
printf("\n按任意键返回主菜单:");
getch();
return;
}
}
void print111(struct LNode a[])
{
int m,n;
printf("\n请选择显示方式:\n");
printf("1--分类显示 \n");
printf("2--全部显示\n");
printf("0--返回菜单\n");
printf("请选择(0-2):");
scanf("%d",&m);
while(m!=1&&m!=2&&m!=0)
{
printf("\n输入错误,请重新选择:");
scanf("%d",&m);
}
if(m==1)
{
printf("\n请输入要查询的分类");
n=select();
print11(a,n);
}
if(m==2)
{
allprint(a);
}
if(m==0)
{
return;
}
}
void namefind(struct LNode a[],int n)
{
char s[20];
int i=0;
char m;
printf("\n请输入想查询的姓名:");
scanf("%s",s);
p1=p=a[n].next;
if(p1==NULL)
{
printf("\n通讯录中没有此人!\n");
return;
}
while(p->next!=NULL)
{
while(strstr(p->data.name,s)==NULL&&p->next!=NULL)p=p->next;
if(strstr(p->data.name,s)!=NULL)
{
i++;
printf("\n类别:");
printf("%d\n",p->data.fenlei);
printf("姓名:");
printf("%s\n",p->data.name);
printf("电话:");
printf("%s\n",p->data.tel);
printf("电子邮件:");
printf("%s\n",p->data.age);
printf("QQ:");
printf("%s\n",p->data.qq);
}
if((p->next==NULL)&&i==0)
{
printf("\n通讯录中没有此人!\n");
printf("\n是否继续查询?(Y/N)");
scanf("%s",&m);
while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%c",&m);
}
if(m!='n'&&m!='N')
{
namefind(a,n);
}
return;
}
if(p->next==NULL)
{
printf("\n查询完成!\n");
printf("\n是否继续查询?(Y/N)");
scanf("%s",&m);
while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&m);
}
if(m!='n'&&m!='N')
{
namefind(a,n);
}
return;
}
else p=p->next;
}
if(strstr(p->data.name,s)!=NULL)
{
i++;
printf("\n类别:");
printf("%d\n",p->data.fenlei);
printf("姓名:");
printf("%s\n",p->data.name);
printf("电话:");
printf("%s\n",p->data.tel);
printf("电子邮件:");
printf("%s\n",p->data.age);
printf("QQ:");
printf("%s\n",p->data.qq);
}
printf("\n查询完成!\n");
printf("\n是否继续查询?(Y/N)");
scanf("%s",&m);
while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&m);
}
if(m!='n'&&m!='N')
{
namefind(a,n);
}
return;
}
void onedelete1(struct LNode a[],int n)
{
char s[20],r;
int i=0;
printf("请输入想删除联系人的姓名:");
scanf("%s",s);
p1=p=a[n].next;
if(p1==NULL)
{
printf("\n通讯录中没有此人!\n");
return;
}
while(strcmp(p->data.name,s)!=0&&p->next!=NULL)p=p->next;
if(strcmp(p->data.name,s) != 0)
{
printf("\n通讯录中没有此人!\n");
return;
}
if(strcmp(p->data.name,s) == 0)
{
printf("类别:");
printf("%d\n",p->data.fenlei);
printf("姓名:");
printf("%s\n",p->data.name);
printf("电话:");
printf("%s\n",p->data.tel);
printf("电子邮件:");
printf("%s\n",p->data.age);
printf("QQ:");
printf("%s\n",p->data.qq);
}
printf("确认删除?(Y/N):");
scanf("%s",&r);
while(r!='n'&&r!='N'&&r!='y'&&r!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&r);
}
if(r=='y'||r=='Y')
{
if(p1==p)a[n].next=p->next;
else
{
while(p1->next!=p)p1=p1->next;
p1->next=p->next;
}
free(p);
a[n].length--;
printf("\n已经成功删除!\n");
return;
}
}
//全部删除函数
void alldelete1(struct LNode a[],int n)
{
char r;
p1=p=a[n].next;
printf("\n确认删除?(Y/N):");
scanf("%s",&r);
while(r!='n'&&r!='N'&&r!='y'&&r!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&r);
}
if(r=='y'||r=='Y')
{
if(p1==NULL)
{
printf("不存在名片!");
return;
}
while(p1->next!=NULL)
{
p=p1->next;
p1->next=p->next;
free(p);
}
a[n].next=NULL;
a[n].length=0;
printf("\n已经成功删除全类名片!\n");
return;
}
if(r=='n'||r=='N')
{
return;
}
}
//选择删除联系人函数
void delete11(struct LNode a[],int n)
{
int m;
printf("\n请选择删除方式:\n");
printf("1--单个删除 \n");
printf("2--全部删除\n");
printf("0--返回菜单\n");
printf("请选择(0-2):");
scanf("%d",&m);
while(m!=1&&m!=2&&m!=0)
{
printf("\n输入错误,请重新选择:");
scanf("%d",&m);
}
if(m==1)
{
onedelete1(a,n);
}
if(m==2)
{
alldelete1(a,n);
}
if(m==0)
{
return;
}
}
void Save()
{
FILE *fp;
int i;
if ((fp=fopen("catalog.dat","wb"))==NULL)
{
printf("\n文件打开失败");
}
for (i=1; i<=6; i++)
{
p=a[i].next;
while(p!=NULL)
{
if (fwrite(&(p->data),sizeof(struct Data),1,fp)==0)
{
printf("\n文件保存错误!\n");
}
p=p->next;
}
}
fclose(fp);
printf("\n按任意键返回主菜单:");
getch();//按任意键退出
return;
}
void namechange(struct LNode a[],int n)
{
char s[20];
char m,ch;
int i=0,k;
p1=a[n].next;
printf("\n请输入想修改的联系人的姓名:");
scanf("%s",s);
if(p1==NULL)
{
printf("\n通讯录中没有此人!\n");
printf("\n是否继续修改?(Y/N)");
scanf("%s",&ch);
while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&ch);
}
if(ch!='n'&&ch!='N')
{
namechange(a,n);
}
return;
}
else
{
while((strcmp(p1->data.name,s)!=0)&&p1->next!=NULL)
p1=p1->next;
if(p1->next ==NULL&&strcmp(p1->data.name,s) != 0)
{
printf("\n通讯录中没有此人!\n");
printf("\n是否继续修改?(Y/N)");
scanf("%s",&ch);
while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&ch);
}
if(ch!='n'&&ch!='N')
{
namechange(a,n);
}
return;
}
}
if(strcmp(p1->data.name,s) == 0)
{
printf("类别:");
printf("%d\n",p1->data.fenlei);
printf("姓名:");
printf("%s\n",p1->data.name);
printf("电话:");
printf("%s\n",p1->data.tel);
printf("电子邮件:");
printf("%s\n",p1->data.age);
printf("QQ:");
printf("%s\n",p1->data.qq);
printf("\n1.修改姓名\n");
printf("2.修改电话\n");
printf("3.修改电子邮件\n");
printf("4.修改地址\n");
printf("5.修改QQ号\n");
printf("0.返回菜单\n");
printf("请您选择(0-5):");
scanf("%d",&k);
while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0)
{
printf("\n输入错误,请重新选择:");
scanf("%d",&k);
}
switch(k)
{
case 1:
printf("\n请输入新的姓名:");
scanf("%s",p1->data.name);
break;
case 2:
printf("\n请输入新的电话:");
scanf("%s",p1->data.tel);
break;
case 3:
printf("\n请输入新的电子邮件:");
scanf("%s",p1->data.age);
break;
case 5:
printf("\n请输入新的QQ号:");
scanf("%s",p1->data.qq);
break;
case 0:
return;
}
printf("\n修改成功!\n");
printf("\n是否继续修改?(Y/N)");
scanf("%s",&m);
while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%c",&m);
}
for(; m=='y'||m=='Y';)
{
printf("请您选择(0-5):");
scanf("%d",&k);
while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0)
{
printf("\n输入错误,请重新选择:");
scanf("%d",&k);
}
switch(k)
{
case 1:
printf("\n请输入新的姓名:");
scanf("%s",p1->data.name);
break;
case 2:
printf("\n请输入新的电话:");
scanf("%s",p1->data.tel);
break;
case 3:
printf("\n请输入新的电子邮件:");
scanf("%s",p1->data.age);
break;
case 5:
printf("\n请输入新的QQ号:");
scanf("%s",p1->data.qq);
break;
case 0:
return;
}
printf("\n修改成功!\n");
printf("\n是否继续修改?(Y/N)");
scanf("%s",&m);
while(m!='n'&&m!='N'&&m!='y'&&m!='Y')
{
printf("\n输入错误!请重新输入:");
scanf("%s",&m);
}
}
if(m=='n'||m=='N');
return;
}
}
int main()
{
int ads,asd;
Readfile();
while(1)
{
switch(ads=menu())
{
case 1:
system("cls");
print111(a);
break;
case 2:
system("cls");
Save();
break;
case 3:
system("cls");
asd=select();
delete11(a,asd);
break;
case 4:
system("cls");
asd=select();
namechange(a,asd);
break;
case 5:
system("cls");
asd=select();
input1(a,asd);
break;
case 6:
system("cls");
asd=select();
namefind(a,asd);
break;
case 0:
system("cls");
exit(0);
default:
ads=menu();
}
}
}