c语言通讯录不用文件夹,关于小型通讯录的问题

已结贴√

问题点数:10 回复次数:2

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

关于小型通讯录的问题

在下面的//处如何编写比较好?求教各位高手了

#include

#include

#include

#include

#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 编辑]

搜索更多相关主题的帖子:

结构体 通讯录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值