flag=1; break; }
s=s->next; }
if(flag==1) /*提示用户是否重新输入*/ {
printf(\编号 %s 已经存在,是否重试?\ } else
{break;} }
p=(Node *)malloc(sizeof(Node)); /*申请内存空间*/ if(!p) {
printf(\申请内存空间失败 \如没有申请到,打印提示信息*/ return ; /*返回主界面*/ }
strcpy(p->data.num,num); /*将字符串num拷贝到p->data.num中*/ stringinput(p->data.name,15,\ stringinput(p->data.phone,12,\ p->data.age=numberinput(\
stringinput(p->data.address,10,\ stringinput(p->data.email,20,\ p->next=NULL; /*表明这是链表的尾部结点*/ r->next=p; /*将新建的结点加入链表尾部中*/ r=p; save=1; }
return ; }
/*查询记录*/
void Find(Link l) /*按编号或姓名,查询电话记录*/ {
int select; /*1:按编号查,2:按姓名查,3:按地址查找,其他:返回主界面(菜单)*/
char searchinput[20]; /*保存用户输入的查询内容*/ Node *p;
if(!l->next) /*若链表为空*/ {
printf(\无!\\n\ return; }
printf(\按编号查询 =====>2 按姓名查询 =====>3 按地址查询\\n\
printf(\请选择[1,2,3]:\ scanf(\
if(select==1) /*按编号查询*/ {
stringinput(searchinput,6,\请输入已存在的编号:\
p=Locate(l,searchinput,\在l中查找学号为searchinput值的节点,并返回节点的指针*/
if(p) /*若p!=NULL*/ {
printhead(); printdata(p); printf(END);
printf(\按任意键返回\ } else
printf(\找不到此人!\\n\ } else
if(select==2) /*按姓名查询*/ {
stringinput(searchinput,15,\请输入已存在的姓名:\ p=Locate(l,searchinput,\ if(p) {
printhead(); printdata(p); printf(END);
printf(\按任意键返回\ } else
printf(\找不到此人!\\n\ }
if(select==3) /*按地址查询*/ {
stringinput(searchinput,15,\请输入已存在的地址:\ p=Locate(l,searchinput,\ if(p) {
printhead(); printdata(p); printf(END);
printf(\按任意键返回\
} else
printf(\找不到此人!\\n\ } else
printf(\输入错误! 按任意键继续**\\n\}
/*按姓名删除学生记录:先找到保存该联系人记录的节点,然后删除该节点*/ void Del(Link l) {
Node *p,*r;
char findmess[20]; if(!l->next) {
printf(\找不到此人的记录!\\n\ return; }
stringinput(findmess,15,\ p=Locate(l,findmess,\ if(p) {
r=l;
while(r->next!=p) r=r->next; r->next=p->next; free(p);
printf(\ save=1; } else
printf(\ }
/*修改电话记录。先按输入的编号查询到该记录,然后提示用户修改编号之外的值,编号不能修改*/
void Modify(Link l) {
Node *p;
char findmess[20]; if(!l->next) {
printf(\ return; }
printf(\ Disp(l);
stringinput(findmess,6,\输入并检验该学号*/
p=Locate(l,findmess,\查询到该节点*/ if(p) /*若p!=NULL,表明已经找到该节点*/ {
printf(\ printf(\
stringinput(p->data.name,15,\ p->data.age=numberinput(\
stringinput(p->data.phone,12,\ stringinput(p->data.address,10,\ stringinput(p->data.email,20,\ printf(\ Disp(l); save=1; } else
printf(\ }
/*数据存盘,若用户没有专门进行此操作且对数据有修改,在退出系统时, 会提示用户
存盘*/
void Save(Link l) {
FILE* fp; Node *p;
fp=fopen(\以只写方式打开二进制文件*/
if(fp==NULL) /*打开文件失败*/ {
printf(\ return ; }
p=l->next; while(p) {
if(fwrite(p,sizeof(Node),1,fp)==1)/*每次写一条记录或一个节点信息至文件*/
{
p=p->next; } else
{break; } }
save=0;
fclose(fp); /*关闭此文件*/ }
/*主函数*/ void main() {
Link l; /*定义链表*/ FILE *fp; /*文件指针*/
int select; /*保存选择结果变量*/ char ch; /*保存(y,Y,n,N)*/
Node *p,*r; /*定义记录指针变量*/ l=(Node*)malloc(sizeof(Node)); if(!l) {
printf(\如没有申请到,打印提示信息*/ return ; /*返回主界面*/ }
l->next=NULL; r=l;
fp=fopen(\以追加方式打开一个二进制文件,可读可写,若此文件不存在,会创建此文件*/
if(fp==NULL) {
printf(\ exit(0); }
while(!feof(fp)) {
p=(Node*)malloc(sizeof(Node)); if(!p) {
printf(\没有申请成功*/
exit(0); /*退出*/ }
if(fread(p,sizeof(Node),1,fp)==1) /*一次从文件中读取一条学生成绩记录*/
{
p->next=NULL; r->next=p;
r=p; /*r指针向后移一个位置*/ } }
fclose(fp); /*关闭文件*/
while(l) {
menu(); p=r;
printf(\请选择服务(0~6):\显示提示信息*/ scanf(\ if(select==0) {
if(save==1) /*若对链表的数据有修改且未进行存盘操作,则此标志为1*/ {
printf(\是否保存之文件?(y/n):\ scanf(\ if(ch=='y'||ch=='Y') Save(l); }
printf(\谢谢使用!\
break; }
switch(select)
{
case 1:Add(l);break; /*增加电话记录*/ case 2:Del(l);break; /*删除电话记录*/ case 3:Modify(l);break; /*修改电话记录*/ case 4:Find(l);break; /*查询电话记录*/ case 5:Disp(l);break; /*打印电话记录*/ case 6:Save(l);break; /*保存电话记录*/
default: printf(\错误:输入错误! 按任意键继续*\\n\ break; /*按键有误,必须为数值0-6*/ } } }