关于C语言包通讯录的模糊查询--该程序的模糊查询函数有问题,求大神帮忙,感激不尽
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
char filename[20]="E:\\tx123.txt";
struct phone
{
char name[20];
char mobile[15];
char phone[15];
char address[50];
struct phone *next;
};
typedef struct phonetel;
tel *head=NULL;
int z=1,x=1; /*标记量X、Z*/
void showmenu()
{ int i;
printf("\n");
for(i=0;i<80;i++)
printf("%c",16);
printf("\n");
printf("\t\t\t\t1:添加记录\n");
printf("\n");
printf("\t\t\t\t2:修改记录\n");
printf("\n");
printf("\t\t\t\t3:查找记录\n");
printf("\n");
printf("\t\t\t\t4:删除记录\n");
printf("\n");
printf("\t\t\t\t5:显示全部录\n");
printf("\n");
printf("\t\t\t\t6:模糊查找\n");
printf("\n");
printf("\t\t\t\t0:退出程序\n");
printf("请在--6选择:\n");
for(i=0;i<80;i++)
printf("%c",17);
}
void creatnew() /*添加记录并按姓名排序*/
{
int n;
tel *new1,*p1,*p2;
new1=(tel *)malloc(sizeof(tel));
aa: printf("\t\t\t请输入姓名:");
scanf("%s",new1->name);
printf("\t\t\t请输入手机号码:");
scanf("%s",new1->mobile);
printf("\t\t\t请输入家庭电话:");
scanf("%s",new1->phone);
printf("\t\t\t请输入家庭住址:");
scanf("%s",new1->address);
p1=head;
if(head!=NULL) /*先判断是否有记录*/
do
{
if((strcmp(p1->mobile,new1->mobile))==0||
(strcmp(p1->phone,new1->phone))==0)
{
printf("记录已经存在\n");
printf("\n%-20s%-15s%-15s%-50s\n",p1->name,p1->mobile,p1->phone,p1->address);
printf("是否继续添加?1 继续添加\t其他数字键重新输入\n");
scanf("%d",&n);
if(n==1)
break;
else
goto aa;
}
p1=p1->next;
}while(p1!=NULL);
p1=head;
if(head==NULL) /*检测是否为空链表*/
{
head=new1; /*链表为空,插入的结点作为第一个结点*/
new1->next=NULL;
}
else
{
while((p1->next!=NULL)&&(strcmp(p1->name,new1->name)<0))
{
p2=p1;
p1=p1->next;
}
if((strcmp(p1->name,new1->name)>0))
{
if(head==p1)
{
new1->next=head;
head=new1;
}
else
{
p2->next=new1;
new1->next=p1;
}
}
else
{
p1->next=new1;
new1->next=NULL;
}
}
}
void save() /*将数据写入文件*/
{
tel *p1=NULL;
FILE *fp;
if((fp=fopen(filename,"w"))==NULL)
{
printf("不能打开文件\n");
return ;
}
p1=head;
for(;p1!=NULL;p1=p1->next)
{
fprintf(fp,"%s\t\t%s\t\t%s\t\t%s\n",
p1->name,
p1->mobile,
p1->phone,
p1->address);
}
printf("操作完毕\n");
fclose(fp);
}
void add( ) /*控制添加记录*/
{
int x=1;
printf("开始添加纪录,在添加记录过程中按0 停止添加\n");
while(x!=0)
{
do
{ creatnew();
printf("操作完成\n");
break;
}while(1);
printf("按结束添加!! 按其他数字键,继续添加!!!\n");
scanf("%d",&x);
if(x==0)
{
save();
system("cls");
}
}
}
void openfile() /*输出文件到链表*/
{
FILE *fp;
tel *p1=NULL,*p2=NULL;
head=NULL;
if((fp=fopen(filename,"r"))==NULL) /*打开文件*/
{ /*文件不存在,表明第一次使用本电话簿*/
printf("\n\t\t\t********这是一个新电话簿*********\n");
return ;
}
while(!feof(fp) ) /*循环读取文件数据*/
{
p1=(tel*)malloc (sizeof(tel));
fscanf(fp,"%s%s%s%s\n",p1->name,p1->mobile,p1->phone,p1->address);
if(head==NULL)
{
head=p1;
p1->next=NULL;
p2=p1;
}
else
{
p2->next=p1;
p1->next=NULL;
p2=p1;
}
}
fclose(fp);
}
void show() /*显示全部记录*/
{
tel *p1=NULL;
if(head==NULL) /*判断是否是空链表*/
{
printf("\n\t\t\t电话簿中没有记录,请输入纪录后,在使用本能!\n");
printf("\t\t\t按任意键返回");
getch();
system("cls");
return;
}
p1=head;
printf("%-20s%-15s%-15s%-50s\n","姓名","手机号码","电话号码","家庭住址");
do
{ /* system("color 04");*/
printf("\n%-20s%-15s%-15s%-50s",p1->name,p1->mobile,p1->phone,p1->address);
p1=p1->next;
}while(p1!=NULL);
printf("\t\t\t按任意键返回");
getch();
system("cls");
}
tel* searchname()/*按姓名查找*/
{
tel *p2=NULL;
printf("\t\t请输入姓名:");
p2=(tel *)malloc(sizeof(tel));
scanf("%s",p2->name);
return p2;
}
tel* searchmobile()/*按手机号码查找*/
{
tel *p2=NULL;
printf("\t\t请输入手机号码:");
p2=(tel *)malloc(sizeof(tel));
scanf("%s",p2->mobile);
return p2;
}
tel* searchphone()/*按家庭电话查找*/
{
tel *p2=NULL;
printf("\t\t请输入家庭电话:");
p2=(tel *)malloc(sizeof(tel));
scanf("%s",p2->phone);
return p2;
}
tel* searchaddress() /*按地址查找*/
{
tel *p2=NULL;
printf("\t\t请输入地址:");
p2=(tel *)malloc(sizeof(tel));
scanf("%s",p2->address);
return p2;
}
void searchshow() /*显示查找选项*/
{
system("cls");
printf("\t\t\t按1 按姓名:\n");
printf("\t\t\t按2 按手机号码:\n");
printf("\t\t\t按3 按家庭电话:\n");
printf("\t\t\t按4 按家庭住址:\n");
}
tel* dimsearch() /*模糊查找*/
{ struct phone *list;
struct phone *p;
p=list;
while(p){
if(strncmp(p->nm,name,2)==0)
printf("%-20s%-15s%-15s%-50s\n","姓名","手机号码","电话号码","家庭住址");
printf("\n%-20s%-15s%-15s%-50s",p1->name,p1->mobile,p1->phone,p1->address);
p=p->next;
}}
else
{
printf("选择错误,请重新选择\n\n");
goto lp;
}
p1=head;
while(p1!=NULL)
{
if((strstr(p1->name,p2->name))||(strstr(p1->mobile,p2->mobile))||
(strstr(p1->phone,p2->phone))||(strstr(p1->address,p2->address)))
{
printf("%-20s%-15s%-15s%-50s\n","姓名","手机号码","电话号码","家庭住址");
printf("%-20s%-15s%-15s%-50s\n",p1->name,p1->mobile,p1->phone,p1->address);
j=1;
printf("是否是本条记录?按确定本条记录\t按其他数字键继续\n");
scanf("%d",&m);
if(m==1)
break;
}
p=p1;
p1=p1->next;
}
printf("\n");
if(j==0||p1==NULL)
{if(j==0&&p1!=NULL)
{printf("\t\t\t没有找到相关记录!!!");
z=0;
}
if(j!=0&&p1==NULL)
{
printf("\t\t\t没有找到其他相关记录!!!");
x=0;
}
if(j==0&&p1==NULL)
{
printf("\t\t\t没有找到相关记录!!!");
z=0;x=0;
}
}
printf("\n\n");
printf("\t\t\t按任意键返回");
getch();
system("cls");
return p;
}
tel * search()
{ int i,j=0;
tel *p1=NULL,*p2=NULL,*p=NULL;
loop: searchshow();
scanf("%d",&i);
if(i>=1&&i<=4)
switch(i)
{
case 1:p2=searchname();break;
case 2:p2=searchmobile();break;
case 3:p2=searchphone();break;
case 4:p2=searchaddress();break;
}
else
{
printf("选择错误,请重新选择\n\n");
goto loop;
}
p1=head;
while(p1!=NULL)
{
if((strcmp(p1->name,p2->name))==0||(strcmp(p1->mobile,p2->mobile))==0||
(strcmp(p1->phone,p2->phone))==0||(strcmp(p1->address,p2->address))==0)
{
printf("找到记录:\n");
printf("%-20s%-15s%-15s%-50s\n","姓名","手机号码","电话号码","家庭住址");
printf("\n%-20s%-15s%-15s%-50s",p1->name,p1->mobile,p1->phone,p1->address);
break;
}
p=p1;
p1=p1->next;
}
if(p1==NULL)
{
printf("\t\t\t电话本中无此记录!!!!!\n\n");
printf("\t\t是否重新进行?按1 继续\t按其他数字键模糊查找!!!\n\n");
scanf("%d",&i);
if(i==1)
{
free(p2);
goto loop;
}
else
{
system("cls"); /* 精确查找没有记录,进行模糊找找*/
p=dimsearch();
}
}
return p;
}
void modify() /*修改记录函数*/
{
tel *new=search();
if(z==0)
;
else
if(x==0);
elseif(z==0&&x==0);
else
{ if(new==NULL)
{
printf("请输入新纪录:\n");
printf("\t\t\t请输入姓名:");
scanf("%s",head->name);
printf("\t\t\t请输入手机号码:");
scanf("%s",head->mobile);
printf("\t\t\t请输入家庭电话:");
scanf("%s",head->phone);
printf("\t\t\t请输入家庭住址:");
scanf("%s",head->address);
save();
}
else
{
printf("请输入新纪录:\n");
printf("\t\t\t请输入姓名:");
scanf("%s",new->next->name);
printf("\t\t\t请输入手机号码:");
scanf("%s",new->next->mobile);
printf("\t\t\t请输入家庭电话:");
scanf("%s",new->next->phone);
printf("\t\t\t请输入家庭住址:");
scanf("%s",new->next->address);
save();
}
}
printf("\n\n");
printf("\t\t\t按任意键继续");
getch();
system("cls");
}
void del() /*删除记录函数*/
{
tel * p2=search();
int i;
if(z==0)
;
else
if(x==0);
elseif(z==0&&x==0);
else
if(p2==NULL)
{
printf("\n\n\n确实要删除吗?\t按1 删除!!!\t按其他数字保留!!\n");
scanf("%d",&i);
if(i==1)
head=head->next;
save();
printf("\t\t\t按任意键返回");
getch();
system("cls");
}
else
{
printf("\n\n\n确实要删除吗?\t按1 删除!!!\t按其他数字保留!!\n");
scanf("%d",&i);
if(i==1)
{
p2->next=p2->next->next;
save();
}
printf("\t\t\t按任意键返回");
getch();
system("cls");
}
}
void fre() /* 释放链表空间*/
{
tel *p=head;
while(head!=NULL)
{
head=head->next;
free(p);
p=head;
}
free(head);
}
main()
{
int x,m;
openfile();
system("color 9a");
while(1)
{
showmenu();
fflush(stdin);
printf("请作出您的选择:");
scanf("%d",&x);
if(x>=0&&x<=6)
{
switch(x)
{
system("cls");
case 1:add();break; /*添加记录函数*/
case 2:modify();break; /*修改记录函数*/
case 3:search();break; /*查找记录函数*/
case 4:del();break; /*删除记录函数*/
case 5:show();break; /*显示全部记录*/
case 6:dimsearch();break; /*模糊查找*/
case 0:fre();printf("\n\t\t欢迎再次使用通讯录管理系统,再见!....\n\n");exit(0);
}
}
else
printf("\n\n选择错误,请再次选择!\n");
}
getch();
}