电话簿管理系统

时间:2025-02-18 07:35:44
  • #include <>
  • #include <>
  • typedef struct
  • {
  • char name[20]; //姓名
  • char number[20]; //电话号码
  • char wechat[20]; //微信号
  • char email[20];
  • }information; //初始化要录入的个人信息的所有内容
  • typedef struct node
  • {
  • information data;
  • struct node *next;
  • }Elem,*Link;
  • int Init(Link elem[13],Link elem2[13],int t)
  • {
  • Link j,k,L,m;
  • int i,p,q,r,a,b,c,d,e;
  • for(i=0;i<t;i++)
  • {
  • L=(Link)malloc(sizeof(Elem)); //定义一个结点
  • L->next=NULL;
  • printf("请输入第%d个人的姓名:",i+1);
  • scanf("%s",&L->);
  • printf("请输入第%d个人的电话号码:",i+1);
  • scanf("%s",&L->);
  • printf("请输入第%d个人的微信号:",i+1);
  • scanf("%s",&L->);
  • printf("请输入第%d个人的邮箱号:",i+1);
  • scanf("%s",&L->);
  • p=strlen(L->); //用名字存储
  • q=L->[p-1];
  • r=q%13; //将初始化录入的人的姓名的最后一个字的ASCII码值对13求余,得到的结果存入相应的位置
  • if(elem[r]->next==NULL)
  • {
  • elem[r]->next=L;
  • L->next=NULL;
  • }
  • else
  • {
  • for(j=elem[r];j->next!=NULL;j=j->next);
  • j->next=L;
  • L->next=NULL;
  • }
  • //将用名字存储的方式得到的结点存入相应的位置
  • a=strlen(L->); //用电话号码存储
  • d=L->[a-1];
  • e=L->[a-2]; //d,e分别获取电话号码的最后一位和倒数第二位
  • b=d+10*e;
  • c=b%13; //通过计算他们的ASCII码值对13求余的结果存到相应的位置
  • m=(Link)malloc(sizeof(Elem));
  • m->next=NULL;
  • m=L;
  • if(elem2[c]->next==NULL)
  • {
  • elem2[c]->next=m;
  • m->next=NULL;
  • }
  • else
  • {
  • for(k=elem2[c];k->next!=NULL;k=k->next);
  • k->next=m;
  • m->next=NULL;
  • }
  • }
  • //将结点存入相应的位置
  • printf("------------------信息录入完成!-----------------\n");
  • printf("\n");
  • return 0;
  • }
  • int Init2(Link elem[13],Link elem2[13]) //文件读写初始化
  • {
  • Link j,k,L,m;
  • char st[20];
  • FILE *fp;
  • int i,p,q,r,a,b,c,d,e,t;
  • if((fp=fopen("d:\\","r"))==NULL)
  • {
  • printf("打开失败!\n");
  • getchar();
  • exit(0);
  • }
  • for(i=1;i<=3;i++)
  • {
  • L=(Link)malloc(sizeof(Elem));
  • L->next=NULL;
  • fgets(st,20,fp);
  • t=strlen(st);
  • st[t-1]='\0';
  • memcpy(L->,st,20);
  • fgets(st,20,fp);
  • t=strlen(st);
  • st[t-1]='\0';
  • memcpy(L->,st,20);
  • fgets(st,20,fp);
  • t=strlen(st);
  • st[t-1]='\0';
  • memcpy(L->,st,20);
  • fgets(st,20,fp);
  • t=strlen(st);
  • st[t-1]='\0';
  • memcpy(L->,st,20);
  • p=strlen(L->); //用名字存储
  • q=L->[p-1];
  • r=q%13;
  • //将初始化录入的人的姓名的最后一个字的ASCII码值对13求余,得到的结果存入相应的位置
  • if(elem[r]->next==NULL)
  • {
  • elem[r]->next=L;
  • L->next=NULL;
  • }
  • else
  • {
  • for(j=elem[r];j->next!=NULL;j=j->next);
  • j->next=L;
  • L->next=NULL;
  • }
  • //将用名字存储的方式得到的结点存入相应的位置
  • a=strlen(L->); //用电话号码存储
  • d=L->[a-1];
  • e=L->[a-2]; //d,e分别获取电话号码的最后一位和倒数第二位
  • b=d+10*e;
  • c=b%13; //通过计算他们的ASCII码值对13求余的结果存到相应的位置
  • m=(Link)malloc(sizeof(Elem));
  • m->next=NULL;
  • m=L;
  • if(elem2[c]->next==NULL)
  • {
  • elem2[c]->next=m;
  • m->next=NULL;
  • }
  • else
  • {
  • for(k=elem2[c];k->next!=NULL;k=k->next);
  • k->next=m;
  • m->next=NULL;
  • }
  • }
  • //将结点存入相应的位置
  • return 0;
  • }
  • int searchname(Link elem[13],char name[20]) //用名字查找
  • {
  • int a,b,c;
  • Link d;
  • a=strlen(name);
  • b=name[a-1];
  • c=b%13;
  • //采用和存储相同的方法查找名字
  • if(strcmp(elem[c]->next->,name)==0) //判断指针指向的名字与输入的名字是否相同,相同则返回0
  • {
  • printf("------------------以下为查找的人的所有信息--------------------\n");
  • printf("姓名:%s\n",elem[c]->next->);
  • printf("电话号码:%s\n",elem[c]->next->);
  • printf("微信:%s\n",elem[c]->next->);
  • printf("邮箱号:%s\n",elem[c]->next->);
  • } //输出所有的个人信息
  • else
  • {
  • for(d=elem[c];d->next!=NULL;d=d->next) //如果第一个结点不是,则需要通过移动到下一个结点的方式直至找到对应的信息
  • {
  • if(strcmp(d->next->,name)==0)
  • {
  • printf("------------------以下为查找的人的所有信息---------------------\n");
  • printf("姓名:%s\n",d->next->);
  • printf("电话号码:%s\n",d->next->);
  • printf("微信:%s\n",d->next->);
  • printf("邮箱号:%s\n",d->next->);
  • break;
  • }
  • }
  • if(d->next==NULL)
  • printf("不存在要找的元素!\n");
  • //如果遍历到最后仍然没有相同的,则说明不存在要查找的元素
  • }
  • return 0;
  • }
  • //用电话号码查找
  • int searchnumber(Link elem2[13],char number[20])
  • {
  • int a,b,c;
  • Link d;
  • a=strlen(number);
  • b=number[a-1]+10*number[a-2];
  • c=b%13; //采用和存储号码相同的方式查找信息
  • if(strcmp(elem2[c]->next->,number)==0)//判断指针指向的电话号码和输入的电话号码的值是否相同
  • {
  • printf("------------------以下为查找的人的所有信息--------------------\n");
  • printf("姓名:%s\n",elem2[c]->next->);
  • printf("电话号码:%s\n",elem2[c]->next->);
  • printf("微信:%s\n",elem2[c]->next->);
  • printf("邮箱号:%s\n",elem2[c]->next->);
  • }
  • else
  • {
  • for(d=elem2[c];d->next!=NULL;d=d->next) //依次遍历存储结构中的每一个结点
  • {
  • if(d->next->==number)
  • {
  • printf("以下为查找的人的所有信息\n");
  • printf("姓名:%s\n",d->next->);
  • printf("电话号码:%s\n",d->next->);
  • printf("微信:%s\n",d->next->);
  • printf("邮箱号:%s\n",d->next->);
  • break;
  • }
  • }
  • if(d->next==NULL)
  • printf("不存在要找的元素\n");
  • //表明查找失败,不存在相应的信息
  • }
  • return 0;
  • }
  • //修改信息
  • int change(char number1[20],char number2[20],Link elem2[13])
  • {
  • int a,b,c,f,g;
  • Link e;
  • a=strlen(number1);
  • f=number1[a-1];
  • g=number1[a-2];
  • b=f+10*g;
  • c=b%13;
  • //修改信息之前要找到对应的要修改的信息的位置
  • if(strcmp(elem2[c]->next->,number1)==0)
  • {
  • memcpy(elem2[c]->next->,number2,strlen(number2));
  • printf("修改成功!\n");
  • }
  • else
  • {
  • for(e=elem2[c];e->next!=NULL;e=e->next)
  • {
  • if(strcmp(e->,number1)==0)
  • {
  • memcpy(e->,number2,strlen(number2));
  • printf("修改成功!\n");
  • break;
  • }
  • }
  • //找到对应的电话号码并对其进行修改
  • printf("不存在要修改的电话号码!\n");
  • }
  • printf("更改后的号码查询只能通过名字查找!\n");
  • //表明查找失败不存在要修改的电话号码
  • printf("\n");
  • return 0;
  • }
  • //删除信息
  • int numberdelete(char number[20],Link elem2[13])
  • {
  • int a,b,c,e,f;
  • Link d,g;
  • a=strlen(number);
  • e=number[a-1];
  • f=number[a-2];
  • b=e+10*f;
  • c=b%13;
  • //要删除,也同样要先通过存储的方式查找到对应的电话号码
  • for(d=elem2[c];d->next!=NULL;d=d->next)
  • {
  • if(strcmp(d->next->,number)==0)
  • {
  • g=elem2[c];
  • while(g->next!=d->next)
  • g=g->next;
  • if(g->next->next==NULL)
  • {
  • g->next=NULL;
  • free(d->next);
  • printf("删除成功!\n");
  • break;
  • }
  • else
  • {
  • g->next=g->next->next;
  • free(d->next);
  • printf("删除成功!\n");
  • break;
  • }
  • //查找到对应的号码对其进行删除
  • }
  • }
  • printf("删除完的只能通过名字查找有效\n");
  • printf("\n");
  • return 0;
  • }
  • //主函数
  • void main() //主函数
  • {
  • int j=0,selection,b,i,t;
  • char z[4]="yes";
  • Link elem[13],elem2[13];
  • for(i=0;i<=12;i++)
  • {
  • elem[i]=(Link)malloc(sizeof(Elem));
  • elem2[i]=(Link)malloc(sizeof(Elem));
  • elem[i]->next=NULL;
  • elem2[i]->next=NULL;
  • }
  • //定义两个数组用来存储姓名和电话
  • char name[20],number[20],number1[20],number2[20],number3[20];
  • while(j==0)
  • {
  • printf("----------------------------------------\n");
  • printf("| 电话簿管理系统 |\n");
  • printf("|--------------------------------------|\n");
  • printf("| |\n");
  • printf("| 1.从文件导入信息 |\n");
  • printf("| |\n");
  • printf("| 2.添加联系人 |\n");
  • printf("| |\n");
  • printf("| 3.查询联系人 |\n");
  • printf("| |\n");
  • printf("| 4.修改电话 |\n");
  • printf("| |\n");
  • printf("| 5.删除电话 |\n");
  • printf("| |\n");
  • printf("| 6.退出系统 |\n");
  • printf("| |\n");
  • printf("----------------------------------------\n");
  • printf("请选择操作:");
  • scanf("%d",&selection);
  • switch(selection)
  • {
  • case 2:
  • {
  • printf("请输入要导入的人的个数:");
  • scanf("%d",&t);
  • Init(elem,elem2,t);
  • //调用导入信息的函数
  • }
  • break;
  • case 1:
  • {
  • Init2(elem,elem2);
  • printf("--------------文件导入完成!---------------\n");
  • printf("\n");
  • //调用导入信息的函数
  • }
  • break;
  • case 3:
  • {
  • printf("-----------------------------------\n");
  • printf(" 1.姓名查询 2.电话查询 \n");
  • printf("-----------------------------------\n");
  • //提供了两种方法查询信息
  • printf("请选择查询方式:");
  • scanf("%d",&b);
  • if(b==1)
  • {
  • printf("请输入要查找的人的名字:");
  • scanf("%s",name);
  • printf("\n");
  • searchname(elem,name);
  • //调用查找姓名的函数
  • }
  • else
  • {
  • printf("请输入要查找的电话号码:");
  • scanf("%s",number);
  • searchnumber(elem2,number);
  • //调用查找电话号码的函数
  • }
  • }
  • break;
  • case 4:
  • {
  • printf("请输入要修改的电话号码:");
  • scanf("%s",number1);
  • printf("请输入修改后的电话号码:");
  • scanf("%s",number2);
  • change(number1,number2,elem2);
  • //调用修改电话号码的函数
  • }
  • break;
  • case 5:
  • {
  • printf("请输入要删除的电话号码:");
  • scanf("%s",number3); //判断是否要执行删除操作
  • printf("请确认是否删除(yes/no):");
  • scanf("%s",z); //判断字符数组中的元素与输入的是否一致
  • if(strcmp(z,"yes")==0)
  • {
  • //执行删除操作
  • numberdelete(number3,elem2);
  • }
  • else if(strcmp(z,"no")==0)
  • {
  • printf("已取消删除操作!\n");
  • }
  • else
  • {
  • printf("输入错误!\n");
  • }
  • //调用删除电话号码的函数
  • }
  • break;
  • case 6:
  • {
  • j=1;
  • printf("谢谢使用!\n");
  • //令j等于1,让switch语句结束,也让整个程序结束
  • }
  • break;
  • }
  • }
  • }