关于小型通讯录的问题
在下面的//处如何编写比较好?求教各位高手了#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define LEN sizeof(struct student)
/*定义通讯录链表结构体*/
struct student
{ char name[20];
char tel[20];
struct student *next;
};
int n=0; /*当前通讯录中记录的个数*/
int savedtag=0; /*是否已保存对当前通讯录所作的修改标记*/
/*按姓名查找通讯录中匹配的记录,有多个匹配记录时,都要显示出来*/
int find(struct student * head)
{
char str[20];
int n=0;
struct student *p1=head;
printf("请输入要查找记录的姓名:");
gets(str);
while(str[0]=='\0')
{printf("请输入要查找记录的姓名:");gets(str);}
if(head==NULL)
{printf("找不到匹配的记录\n");return(n);}
else
{
//此处按照输入的姓名在链表中查找记录,将找到的记录输出,并记录匹配的记录个数
return(n);
}
}
/*按姓名删除通讯录中匹配的记录,找到后需用户确认是否删除,
有多个匹配记录时,逐一找出来要求用户确认*/
struct student *del(struct student *head)
{ struct student *p1,*p2;
char name[20],str[5];
int i=0;
printf("请输入要删除记录的姓名:");
gets(name);
while(name[0]=='\0')
{printf("请输入要删除记录的姓名:");gets(name);}
if(head==NULL) {printf("\n找不到要删除的记录\n");return(head);}
//此处按照输入的姓名查找记录,找到后提示用户是否确认删除,如果有记录被删除将savedtag置1,以便最后确认文件被修改是否需要保存
return(head);
}
/*将新的记录插入到通讯录中*/
struct student *insert(struct student *head)
{ struct student *p0,*p1,*p2;
p1=head;
p0=(struct student*) malloc(LEN);
printf("请输入姓名:");
gets(p0->name);
while(p0->name[0]=='\0'){printf("请输入姓名:");gets(p0->name);}
printf("请输入电话号码:");
gets(p0->tel);
while(p0->tel[0]=='\0'){printf("请输入电话号码:");gets(p0->tel);}
//在链表中插入一个新记录,注意有新记录插入时将savedtag置1,以便最后确认文件被修改是否需要保存
return(head);
}
/*显示通讯录中所有的记录*/
void print(struct student *head)
{
//对链表输出
}
/*将对当前通讯录所作的修改保存到文件中*/
void save(struct student *head,char filename[20])
{
//将链表中的记录保存到文件中,保存后savedtag置0
savedtag=0;
}
/*关闭当前通讯录,若当前通讯录尚有所作的修改未保存,询问用户是否需要保存*/
void closetxl(struct student *head,char filename[20])
{
char str[5];
struct student *p1,*p2;
p1=p2=head;
if(savedtag==1)
{
printf("通讯录已修改,是否需要保存?(y/n)");
gets(str);
while(1)
if(str[0]=='Y'||str[0]=='y')
{
//将链表中的记录保存到文件中,并清空链表
return;
}
else if(str[0]=='N'||str[0]=='n')
{
//不保存记录,并清空链表
return;
}
}
}
void menu1()
{
printf("\t\t**********************\n");
printf("\t\t* 这是一个小型的 *\n");
printf("\t\t* 通讯录程序。 *\n");
printf("\t\t* 欢迎使用! *\n");
printf("\t\t**********************\n\n\n\n");
}
/*菜单处理函数*/
int menu3()
{
char s[2];
int cn=0;
printf("\n\n请选择:1.增加记录 2.显示记录 3.删除记录 4.查找记录 5.保存记录 6.关闭通讯录\n\n");
for(;;)
{
gets(s);
cn=atoi(s);
if(cn<1||cn>6) printf("\n输入错误,请选1~6:");
else break;
}
return cn;
}
/*菜单处理函数*/
int menu2()
{
char s[2];
int cn=0;
printf("\n\n请选择:\n1.新建通讯录文件\n2.打开通讯录文件\n3.合并通讯录文件\n4.退出程序\n\n");
for(;;)
{
gets(s);
cn=atoi(s);
if(cn<1||cn>4) printf("\n输入错误,请选1~4:");
else break;
}
return cn;
}
/*处理内存中的通讯录链表*/
void deallink(struct student *head,char filename[20])
{
for(;;){
switch(menu3())
{
case 1: head=insert(head);break;
case 2: print(head);break;
case 3: head=del(head);break;
case 4: find(head);break;
case 5: save(head,filename);break;
case 6: closetxl(head,filename);return;
}
}
}
/*新建通讯录文件,若输入的文件名已存在,则重新输入*/
void creattxl()
{
char str[20];
FILE *fp;
struct student *head;
printf("请输入新通讯录文件的文件名:");
gets(str);
while(1){
if(str[0]=='\0')
{printf("请输入新通讯录文件的文件名:");gets(str);}
else
{if((fp=fopen(str,"rb"))!=NULL) {fclose(fp);printf("该文件已经存在,请重新输入文件名:");gets(str);}
else break;
}};
head=NULL;
n=0;
savedtag=0;
deallink(head,str);
}
/*打开已存在的通讯录文件*/
void opentxl()
{
char str[20];
struct student *head,*p1,*p2;
FILE *fp;
printf("请输入要打开的通讯录文件的文件名:");
gets(str);
do{if((fp=fopen(str,"rb+"))==NULL) {printf("该文件不能打开,请重新输入文件名:");gets(str);}
else break;}while(1);
head=NULL;
n=0;
savedtag=0;
//打开文件,将文件中的记录读入内存并建立链表
fclose(fp);
deallink(head,str);
}
/*合并多个已存在的通讯录文件,并将合并后的通讯录保存到新的文件中*/
void hebintxl()
{
char str[20];
struct student *head,*p1,*p2;
FILE *fp;
int i=1;
printf("请输入第%d个要合并的通讯录文件的文件名:",i);
gets(str);
do{if((fp=fopen(str,"rb+"))==NULL) {printf("该文件不能打开,请重新输入文件名:");gets(str);}
else {i++;break;}}while(1);
head=NULL;
n=0;
//读入第一个通讯录文件,并建立链表
fclose(fp);
printf("要输入第%d个要合并的通讯录文件的文件名吗?(y/n):",i);
gets(str);
do{
if(str[0]=='Y'||str[0]=='y')
{
printf("请输入第%d个要合并的通讯录文件的文件名:",i);
gets(str);
do{if((fp=fopen(str,"rb+"))==NULL) {printf("该文件不能打开,请重新输入文件名:");gets(str);}
else {i++;break;}}while(1);
//读入第n个通讯录文件,并将记录加到第一个链表中
fclose(fp);
}
else if(str[0]=='N'||str[0]=='n') break;
printf("要输入第%d个要合并的通讯录文件的文件名吗?(y/n):",i);
gets(str);
}while(1);
printf("请输入合并后的通讯录文件的文件名:");
gets(str);
while(1){
if(str[0]=='\0')
{printf("请输入合并后的通讯录文件的文件名:");gets(str);}
else
{if((fp=fopen(str,"rb"))!=NULL) {fclose(fp);printf("该文件已经存在,请重新输入文件名:");gets(str);}
else break;
}};
print(head);
save(head,str);
deallink(head,str);
}
main()
{
menu1();
for(;;){
switch(menu2())
{
case 1: creattxl();break;//新建通讯录文件
case 2: opentxl();break;//打开通讯录文件
case 3: hebintxl();break;//合并多个通讯录文件
case 4: exit(0);
}
}
}
[ 本帖最后由 smileRan 于 2011-6-3 20:19 编辑 ]