大家帮忙看看这段代码,有几个问题
find(),del()两个函数有点问题。
首先是find()函数,
先输入a,b两个联系人,然后用find()查找序号为5的人,本应该输出无此人,但却直接跳到了main();把if(j=0){printf("查无此人\n");}跳过了。
然后是del()
首先执行put()输出联系人,然后询问要删除的联系人序号,接着输入要删除序号为1的联系人,却又执行了一次put()函数。deL()函数语义可能有点错误,但语法没错。怎么看都不可能又执行put()的吧
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<malloc.h>
#define N sizeof(struct person)
struct person
{
int num;//联系人序号
char name[20];//联系人名字
int phone;//联系人电话
struct person *next;
};
void menu();//主菜单
void get();//输入联系人
void put();//输出联系人
void save(struct person *head);//存储联系人
void add();//添加联系人
void find();//查找联系人
void del();//删除联系人
int password();//判断密码是否正确
void PWserve();//密码服务
struct person *creat(int nn);//输入联系人
int i,t;
void main()
{
int aa;
while(1)
{
printf("输入\n");
scanf("%d",&aa);
fflush(stdin);
switch(aa)
{
case 1:get();break;
case 2:put();break;
case 3:add();break;
case 4:find();break;
case 5:del();break;
case 0: exit(0);
}
}
}
void get()
{struct person *head;
head=creat(1);
save(head);
}
struct person *creat(int nn)
{
int n=0;
int no;//记录联系人序号
no=nn;
struct person *head,*p1,*p2;
p1=p2=(struct person *)malloc(N);
p1->num=no;
printf("若要结束输入,在输入姓名和号码时都输入0");
printf("输入联系人姓名:");
gets(p1->name);
printf("输入联系人5位号码:");
scanf("%d",&p1->phone);
head=NULL;
while(p1->phone!=0)
{
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct person *)malloc(N);
fflush(stdin);
printf("输入联系人姓名:");
gets(p1->name);
no++;
p1->num=no;
printf("输入联系人5位号码:");
scanf("%d",&p1->phone);
}
p2->next=NULL;
return head;
}
void save(struct person *head)
{
FILE *fp;
if((fp=fopen("PhoneBook.dat","wb"))==NULL)
{
printf("打开错误");
return;
}
struct person *p;
p=head;
if(head!=NULL)
do
{
if(fwrite(p,sizeof(struct person),1,fp)!=1)
{printf("写入错误");}
p=p->next;
}while(p!=NULL);
fclose(fp);
}
void put()
{
FILE *fp;
struct person *p;
if((fp=fopen("PhoneBook.dat","rb"))==NULL)
{
printf("打开错误");
return;
}
p=(struct person *)malloc(N*sizeof(struct person));
while(fread(p,sizeof(struct person),1,fp))
{
printf("%d\t%s\t%d\t\n",p->num,p->name,p->phone);
p++;
}
fclose(fp);//free(p);??????????????????????????????
}
void add()
{
FILE *fp,*fp2;
struct person *p,*p2;
struct person *head;
p=(struct person *)malloc(N*sizeof(struct person));
if((fp=fopen("PhoneBook.dat","rb"))==NULL)
{
printf("打开错误");
return;
}
fseek(fp,-sizeof(struct person),2);
fread(p,sizeof(struct person),1,fp);
i=p->num+1;
fclose(fp);
free(p);
head=creat(i);
if((fp2=fopen("PhoneBook.dat","ab"))==NULL)
{
printf("打开错误");
return;
}
fseek(fp2,0*sizeof(struct person),2);
p2=head;
if(head!=NULL)
do
{
if(fwrite(p2,sizeof(struct person),1,fp2)!=1)
{printf("写入错误");}
p2=p2->next;
}while(p2!=NULL);
fclose(fp2);
}
void find()
{
int aa,j=0;
FILE *fp;
struct person *p;
if((fp=fopen("PhoneBook.dat","rb"))==NULL)
{
printf("打开错误");
return;
}
p=(struct person *)malloc(N*sizeof(struct person));
printf("按序号查询请按1\n按姓名查询请按2\n按号码查询请按3\n");
scanf("%d",&aa);
fflush(stdin);
if(aa==1)
{int f;
printf("输入你要查询的联系人序号\n");
scanf("%d",&f);
fseek(fp,(f-1)*sizeof(struct person),0);
if((fread(p,sizeof(struct person),1,fp))!=NULL)
{printf("%d\t%s\t%d\t\n",p->num,p->name,p->phone);
j++;
}
fclose(fp);
if(j=0)
{printf("查无此人\n");}
}
if(aa==2)
{
char f[20];
printf("输入你要查询的联系人姓名\n");
gets(f);
while(fread(p,sizeof(struct person),1,fp))
{
if(strcmp(f,p->name)==0)
{
printf("%d\t%s\t%d\t\n",p->num,p->name,p->phone);
j++;
break;
}
p++;
}
fclose(fp);
if(j=0)
{printf("查无此人\n");}
}
if(aa==3)
{
int f;
printf("输入你要查询的号码(可输入完整的号码,或是号码开头的几个数字)\n");
scanf("%d",&f);
while(fread(p,sizeof(struct person),1,fp))
{
if(f<10)
{
i=p->phone/10000;
if(f==i)
{printf("%d\t%s\t%d\t\n",p->num,p->name,p->phone);j++;}
p++;
}
if(f<100&&f>9)
{
i=p->phone/1000;
if(f==i)
{printf("%d\t%s\t%d\t\n",p->num,p->name,p->phone);j++;}
p++;
}
if(f<1000&&f>99)
{
i=p->phone/100;
if(f==i)
{printf("%d\t%s\t%d\t\n",p->num,p->name,p->phone);j++;}
p++;
}
if(f<10000&&f>999)
{
i=p->phone/10;
if(f==i)
{printf("%d\t%s\t%d\t\n",p->num,p->name,p->phone);j++;}
p++;
}
if(f>9999)
{
i=p->phone;
if(f==i)
{printf("%d\t%s\t%d\t\n",p->num,p->name,p->phone);j++;}
p++;
}
}
fclose(fp);
if(j=0)
{printf("查无此人\n");}
}
}
void del()
{
int aa,j=0;
char bb;
put();
putchar(10);
printf("输入你要删除的联系人序号\n");
scanf("%d",&aa);
FILE *fp;
struct person *p;
if((fp=fopen("PhoneBook.dat","rb"))==NULL)
{
printf("打开错误");
return;
}
p=(struct person *)malloc(N*sizeof(struct person));
while(fread(p,sizeof(struct person),1,fp))
{
if(aa==p->num)
{
j=1;
printf("你确定要删除此人吗?\n%d\t%s\t%d\t\nY-是,N-否\n",p->num,p->name,p->phone);
bb=getchar();
if(bb=='Y')
{
i=p->num;
j=2;
FILE *fp2;
struct person *p2;
p2=(struct person *)malloc(N*sizeof(struct person));
while(fread(p2,sizeof(struct person),1,fp))
{
p2->num=p2->num-1;
p2++;
}
fclose(fp);
if((fp2=fopen("PhoneBook.dat","ab"))==NULL)
{
printf("打开错误\n");
return;
}
fseek(fp,(i-1)*sizeof(struct person),2);
do
{
if(fwrite(p2,sizeof(struct person),1,fp2)!=1)
{printf("写入错误");}
p2++;
}while(p2!=NULL);
fclose(fp2);
}
break;
}
p++;
}
if(j!=1&&j!=2)
{printf("无此人");}
}