#include "letter.h"
int count; //全局变量 记录计数
int savedTag=0; //记录是否已保存标志
void main()
{
printf("\n");
printf("\t***************************************\n");
printf("\t* *\n");
printf("\t* 简易的通讯录管理程序 *\n");
printf("\t* *\n");
printf("\t* 欢迎使用 *\n");
printf("\t* *\n");
printf("\t* ver(1.0) *\n");
printf("\t* 设计: 编码: *\n");
printf("\t* *\n");
printf("\t***************************************\n");
printf("\n");
count=0;
handle_menu(NULL);
}
//菜单处理函数
void handle_menu(ADDR *top) //void handle_menu(ADDR *);
{
for( ; ; ){
switch(menu_select())
{
case 1:
top=slstore(top);
break;
case 2:
display(top);
break;
case 3:
save(top);
break;
case 4:
free_nodes(top); //首先销毁原来链表所占用的内存
top=load();
break;
case 5:
top=delete_record(top);
break;
case 6:
top=new_addrBook(top);
break;
case 7:
find_record(top);
break;
case 8:
link_files();
break;
case 9:
quit(top);
}
}
}
//菜单选择函数
int menu_select()
{
char s[2];
int cn=0;
printf("\n");
printf("1.增加记录\n");
printf("2.显示记录\n");
printf("3.保存记录\n");
printf("4.读取记录\n");
printf("5.删除记录\n");
printf("6.新建通讯录\n");
printf("7.查询记录\n");
printf("8.连接文件\n");
printf("9.退出运行\n");
printf("\n左边数字对应功能选择,请选1-9:");
for( ; ; )
{
gets(s);
cn=atoi(s);
if(cn<1||cn>9)printf("\n输入错误,重选1-9:");
else break;
}
return cn;
}
/*********************************
*释放以top为头部的链表的内存空间
*参数top:当前通讯录链表的表头
*********************************/
void free_nodes(ADDR *top)
{
ADDR *p=top;
ADDR *old=p;
while(p) //未到表尾
{
old=p;
p=p->next;
free(old);
}
count=0;
}
/*********************************
*退出运行
*参数top:当前通讯录链表的表头
*********************************/
void quit(ADDR *top)
{
char str[2];
if (savedTag==1) //已改动,未保存
{
printf("通讯录已改动,是否保存?(y/n)\n");
gets(str);
if(str[0]=='y'||str[0]=='Y'||str[0]=='\0')
save(top);
}
printf("退出操作,再见!\n");
free_nodes(top);
exit(0);
}
/*********************************
*新建通讯录
*参数top:当前通讯录链表的表头
*返回 新建通讯录的链表的表头
*********************************/
ADDR *new_addrBook(ADDR *top)
{
char str[2];
if (savedTag==1) //已改动,未保存
{
printf("通讯录已改动,是否保存?(y/n)\n");
gets(str);
if(str[0]=='y'||str[0]=='Y'||str[0]=='\0')
save(top); //保存通讯录
}
free_nodes(top); //释放原来通讯录所占用的内存空间
top=NULL;
top=slstore(top); //插入新记录
return top;
}
/*********************************
*输入数据函数
*参数top:当前通讯录链表的表头
*返回 读取记录后的链表
*********************************/
//可以多次选择此菜单进行输入,如果已经读入 一个文件,则追加在其尾部
ADDR *slstore(ADDR *top)
{
ADDR *old,*star;
ASK(star);
if(top!=NULL) //当前有记录
{
//到达已有记录的底端
old=top;
while(old->next!=NULL)
{
old=old->next;
}
}
else
{
//将第一个记录赋予top
old=top=star;
}
//输入新记录
printf("输入数据,输入0时结束。\n");
--count;
do
{
++count;
printf("姓名:");
gets(star->name);
if(strcmp(star->name,"0")==0) //姓名为0则结束添加记录操作
break;
printf("电话:");
gets(star->tel);
if(top!=star) //不是表头则连接到表尾
{
old->next=star;
old=star;
}
ASK(star);
}while(1);
savedTag=1; //记录已改动,未保存
if(top==star) //说明没有加入一条记录
{
top=NULL;
savedTag=0;
}
else
old->next=NULL;
free(star);
return (top);
}
/*********************************
*显示信息函数
*参数top:当前通讯录链表的表头
*********************************/
void display(ADDR *top)
{
ADDR *p;
if(top==NULL)
{
printf("\n现在没有记录!\n");
return;
}
p=top;
printf("\n现在共有如下%d条记录:\n",count);
printf("姓名\t电话\n");
while(p!=NULL)
{
printf("%s\t%s\n",p->name,p->tel);
p=p->next;
}
}
/*********************************
*文件存储操作函数
*参数top:当前通讯录链表的表头
*********************************/
void save(ADDR *top)
{
ADDR *p;
FILE *fp;
char fname[20];
if(top==NULL)
{
printf("没有记录可存!");
return;
}
printf("请输入要存入的文件名(直接回车选择文件sname):\n");
gets(fname);
if(strlen(fname)==0)
strcpy(fname,"sname");
if((fp=fopen(fname,"w"))==NULL)
{
printf("无法存入文件!\n");
return;
}
printf("\n存文件...\n");
p=top;
while(p)
{
fwrite(p,LEN,1,fp);
p=p->next;
}
fclose(fp);
printf("%d条记录已经存入文件,请继续操作。\n",count);
savedTag=0;
}
/*********************************
*文件读取操作函数
*参数top:当前通讯录链表的表头
*返回 读取记录后的链表
*********************************/
ADDR *load(void)
{
FILE *fp;
ADDR *p,*old,*top;
char fname[20];
count=0;
printf("请输入要读取的文件名(直接回车选择文件sname):\n");
gets(fname);
if(strlen(fname)==0)
strcpy(fname,"sname");
if((fp=fopen(fname,"r"))==NULL)
{
printf("打不开文件!请重新选择\n");
return NULL;
}
printf("\n读文件...\n");
ASK(p);
top=p;
old=top;
while(!feof(fp))
{
if(fread(p,LEN,1,fp)!=1)break;
count++;
ASK(p->next);
old=p;
p=p->next;
}
old->next=NULL;
fclose(fp);
printf("读入%d条记录。",count);
return (top);
}
/*********************************
*查询指定记录
*参数top:当前通讯录链表的表头
*无返回值
*********************************/
void find_record(ADDR *top)
{
char choose[2],input[30];
int cn=0;
ADDR *old,*star;
if(count==0)
{
printf("表中无记录,退出查询\n");
return;
}
printf("可以通过姓名或电话查询\n ");
printf("1.通过姓名\n ");
printf("2.通过电话\n ");
gets(choose);
while(1)
{
cn=atoi(choose);
if(cn!=1&&cn!=2)
{
printf("输入错误!重选1-2:");
gets(choose);
}
else break;
}
switch(cn)
{
case 1:
printf("请输入姓名:");
break;
case 2:
printf("请输入电话:");
}
gets(input);
old=star=top;
while(star!=NULL)
{
if((cn==1&&strcmp(input,star->name)==0)
||(cn==2&&strcmp(input,star->tel)==0))
{
printf("查询的完整信息如下\n");
printf("姓名\t电话\n");
printf("%s\t%s\n",star->name,star->tel);
return;
}
else
{
old=star;
star=star->next;
}
}
printf("没有找到相应的记录。\n");
return;
}
/*********************************
*删除指定的记录
*参数top:当前通讯录链表的表头
*返回:删除记录后的链表
*********************************/
ADDR *delete_record(ADDR *top)
{
char choose[2],input[30];
int cn=0;
ADDR *old,*star;
if(count==0)
{
printf("表中已无记录,退出删除操作!\n");
return top;
}
printf("可以通过姓名或电话删除记录\n ");
printf("1.通过姓名\n ");
printf("2.通过电话\n ");
gets(choose);
while(1)
{
cn=atoi(choose);
if(cn!=1&&cn!=2)
{
printf("输入错误!重选1-2:");
gets(choose);
}
else break;
}
switch(cn)
{
case 1:
printf("请输入姓名:");
break;
case 2:
printf("请输入电话:");
}
gets(input);
old=star=top;
while(star!=NULL)
{
if((cn==1&&strcmp(input,star->name)==0)
||(cn==2&&strcmp(input,star->tel)==0))
{
if(star==top)
top=star->next;
else
{
printf("将要删除的信息如下\n"); //给出被删除的信息
printf("姓名\t电话\n");
printf("%s\t%s\n",star->name,star->tel);
old->next=star->next;
free(star);
printf("deleted it."); //给出删除成功的信息
评论0