数据结构课程设计——电话号码查询系统(C语言)
1、利用结构体定义结点{//姓名//电话号码//微信号//QQ号//初始化要录入的个人信息的所有内容{2、手动输入信息和文件读取信息在文件读取中需要自己先创建一个txt文件,并根据自己创建的文件修改代码中的文件路径{for(i=0;i
·
1、项目实现的主要功能
1、通过文件导入和手动输入两种方式录入个人的基本信息(姓名、电话、QQ、微信)
2、可通过输入姓名或者电话号码来查询录入的人的基本信息
3、也可通过该系统修改和删除信息
2、操作界面演示
1、菜单界面
2、读取文件(这里需要先创建一个txt文件)
3、手动添加信息
4、查询个人信息
5、修改信息
6、删除信息
3、代码介绍
1、利用结构体定义结点
typedef struct
{
char name[20]; //姓名
char number[20]; //电话号码
char wechat[20]; //微信号
char QQ[20]; //QQ号
}information; //初始化要录入的个人信息的所有内容
typedef struct node
{
information data;
struct node *next;
}Elem,*Link;
2、手动输入信息和文件读取信息
在文件读取中需要自己先创建一个txt文件,并根据自己创建的文件修改代码中的文件路径
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->data.name);
printf("请输入第%d个人的电话号码:",i+1);
scanf("%s",&L->data.number);
printf("请输入第%d个人的微信号:",i+1);
scanf("%s",&L->data.wechat);
printf("请输入第%d个人的QQ号:",i+1);
scanf("%s",&L->data.QQ);
p=strlen(L->data.name); //用名字存储
q=L->data.name[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->data.number); //用电话号码存储
d=L->data.number[a-1];
e=L->data.number[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 OK;
}
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:\\test.txt","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->data.name,st,20);
fgets(st,20,fp);
t=strlen(st);
st[t-1]='\0';
memcpy(L->data.number,st,20);
fgets(st,20,fp);
t=strlen(st);
st[t-1]='\0';
memcpy(L->data.wechat,st,20);
fgets(st,20,fp);
t=strlen(st);
st[t-1]='\0';
memcpy(L->data.QQ,st,20);
p=strlen(L->data.name); //用名字存储
q=L->data.name[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->data.number); //用电话号码存储
d=L->data.number[a-1];
e=L->data.number[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 OK;
}
3、两种查询方式
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->data.name,name)==0) //判断指针指向的名字与输入的名字是否相同,相同则返回0
{
printf("------------------以下为查找的人的所有信息--------------------\n");
printf("姓名:%s\n",elem[c]->next->data.name);
printf("电话号码:%s\n",elem[c]->next->data.number);
printf("微信:%s\n",elem[c]->next->data.wechat);
printf("QQ:%s\n",elem[c]->next->data.QQ);
} //输出所有的个人信息
else
{
for(d=elem[c];d->next!=NULL;d=d->next) //如果第一个结点不是,则需要通过移动到下一个结点的方式直至找到对应的信息
{
if(strcmp(d->next->data.name,name)==0)
{
printf("------------------以下为查找的人的所有信息---------------------\n");
printf("姓名:%s\n",d->next->data.name);
printf("电话号码:%s\n",d->next->data.number);
printf("微信:%s\n",d->next->data.wechat);
printf("QQ:%s\n",d->next->data.QQ);
break;
}
}
if(d->next==NULL)
printf("不存在要找的元素!\n");
//如果遍历到最后仍然没有相同的,则说明不存在要查找的元素
}
return OK;
}
//用电话号码查找
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->data.number,number)==0)//判断指针指向的电话号码和输入的电话号码的值是否相同
{
printf("------------------以下为查找的人的所有信息--------------------\n");
printf("姓名:%s\n",elem2[c]->next->data.name);
printf("电话号码:%s\n",elem2[c]->next->data.number);
printf("微信:%s\n",elem2[c]->next->data.wechat);
printf("QQ:%s\n",elem2[c]->next->data.QQ);
}
else
{
for(d=elem2[c];d->next!=NULL;d=d->next) //依次遍历存储结构中的每一个结点
{
if(d->next->data.number==number)
{
printf("以下为查找的人的所有信息\n");
printf("姓名:%s\n",d->next->data.name);
printf("电话号码:%s\n",d->next->data.number);
printf("微信:%s\n",d->next->data.wechat);
printf("QQ:%s\n",d->next->data.QQ);
break;
}
}
if(d->next==NULL)
printf("不存在要找的元素\n");
//表明查找失败,不存在相应的信息
}
return OK;
}
4、修改信息
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->data.number,number1)==0)
{
memcpy(elem2[c]->next->data.number,number2,strlen(number2));
printf("修改成功!\n");
}
else
{
for(e=elem2[c];e->next!=NULL;e=e->next)
{
if(strcmp(e->data.number,number1)==0)
{
memcpy(e->data.number,number2,strlen(number2));
printf("修改成功!\n");
break;
}
}
//找到对应的电话号码并对其进行修改
printf("不存在要修改的电话号码!\n");
}
printf("更改后的号码查询只能通过名字查找!\n");
//表明查找失败不存在要修改的电话号码
printf("\n");
return OK;
}
5、删除信息
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->data.number,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 OK;
}
6、主函数
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;
}
}
}
更多推荐
已为社区贡献1条内容
所有评论(0)