用C语言写的通讯录,高手帮忙看看哈哈哈
#include<stdio.h>#include<stdlib.h>
#include<string.h>
#define True 1
//函数声明
struct person*read();//从文件中读取个人信息
void write(struct person*f); //向文件中写入记录
void find(struct person*f); //查询信息
void modify(struct person*f); //修改信息
struct person*add(struct person*f);//添加信息
struct person*del(struct person*f); //删除信息
void list(struct person*f); //浏览信息
struct person //建立个人信息结构,采用单向链表
{
struct person*front; //从文件中读取是否会站更大空间?
struct person*behind;//测占四个字节
int number;//序号
char name[10];//姓名
char sex;//性别
int telephone;//电话号码
int QQ;
int homenumber;//家庭电话
char email;//电子邮件
char address[30];//通讯地址
struct
{
unsigned short year;
unsigned short month;
unsigned short day;
}birthday; //出生日期
};
void mian()
{
char ch;
struct person*f;//声明指向结构体的指针变量,记录链表的首地址
f=read();//从文件中读取信息,并初始化结构体数组
while(True)
{
printf("\n\n\t\t**欢迎使用此通讯录管理系统**\n\n\n");
printf("\t\t请选择(1-7):\n");
printf("\t\t***********************************\n");
printf("\t\t\t1.查询通讯录信息\n");
printf("\t\t\t2.修改通讯录信息\n");
printf("\t\t\t3.添加通讯录信息\n");
printf("\t\t\t4.删除通讯录信息\n");
printf("\t\t\t5.保存信息到文件\n");
printf("\t\t\t6.浏览通讯录信息\n");
printf("\t\t\t7.退出系统\n");
printf("\n\n\t\t*******************************\n");
printf("\n\t\t你的选择是:");
ch=getchar();
switch(ch)
{
case '1':find(f);break;
case '2':modify(f);break;
case '3':f=add(f);break;
case '4':f=del(f);break;
case '5':write(f);break;
case '6':list(f);break;
case '7':return;
default:printf("\t\t选择错误,请重新选择(1-7):\n");
getchar();
}
}
return;
}
//从文件“filename”中读取信息到结构数组中
struct person*read(char*filename)
{
FILE*fp;
int n=0;
struct person*f,*readdata;//记录首地址及新分配地址
struct person*p; //中间变量
if((fp=fopen("filename","rb"))==NULL)
{
printf("\n\n\t文件无法打开!");
printf("\n\n\t按任意键进入主菜单······");
getchar();
return 0;
}
else
{
//申请分配内存空间,并获得内存分配首地址
readdata=(struct person*)malloc(sizeof(struct person));
//循环读取文件信息到新分配的内存空间
while(fread(readdata,sizeof(struct person),1,fp)==1)
{
if(n==0) //说明需要建立链表起始项
{
f=readdata;
f->front=NULL;
f->behind=NULL;
p=readdata;
}
else//说明追加链表数据项
{
p->behind=readdata;
readdata->front=p;
readdata->behind=NULL;
p=readdata;
}
n++;
readdata=(struct person*)malloc(sizeof(struct person));
}
fclose(fp);
printf("\n\n通讯录信息读取完毕,共有%d人!\n",n);
}
printf("\n按任意键进入菜单····");
return f;
}
//向通讯录文件写入记录
void write(struct person*f)
{FILE*fp;//声明文件指针
int n=0;//统计存入通讯录人数
if(f==NULL)//内存中无信息记录
{
printf("没有信息可存!按任意键返回主菜单···\n");
getchar();
return;
}
if((fp=fopen("filename","wb"))!=NULL)
{
do
{
fwrite(f,sizeof(struct person),1,fp);
n++;
f=f->behind;
}while(f!=NULL);
fclose(fp);
printf("\n\n\t\t%d条信息记录保存完毕!\n",n);
}
else
printf("\t\t无法打开通讯录文件!n");
printf("\n\n\n\t按任意键返回主菜单···");
getchar();
}
//查询通讯录个人信息(依据人名)
void find(struct person*f)
{
char name[10];
if(f==NULL)//说明内存无信息
{
printf("当前还没有信息!按任意键返回主菜单···\n");
getchar();
return;
}
printf("\t请输入需查询信息的人名:");
gets(name); //从键盘读取字符串
while(f!=NULL)//从连表开始向后查找
{
if(strcmp(f->name,name)==0) //显示并找到
//显示该人的信息
printf("\n\t\t\t%s的信息如下:",name);
printf("\n\t\t\t*************************\n\n");
printf("% -3S%-9S%-3S%-9S%-9S%-9S%-9S%-9S%-9S","序号","姓名","性别","电话号码","QQ号码","家庭号码","电子邮件","通讯地址","出生日期");
printf("%d%-6s%-3s",f->number,f->name,f->sex);
printf("&-9d%-9d%-9d",f->telephone,f->QQ,f->homenumber);
printf("%-9s%-9s",f->email,f->address);
printf("%d%d%d\n",f->birthday.year,f->birthday.month,f->birthday.day);
printf("\n按任意键返回主菜单···");
getchar();
return;
}
f=f->behind;
}
//循环自动结束意味着未找到
printf("\n\n\t\t您所输入的人名不存在!按任意键返回主菜单···\n");
getchar();
return;
}
//浏览通讯录信息
void list(struct person*f)
{
printf("\n\n\t\t\t通讯录全部信息如下:\n");
printf("\t\t\t*****8*********8***************\n\n");
if(f!=NULL)
{
do
{printf("% -3S%-9S%-3S%-9S%-9S%-9S%-9S%-9S%-9S","序号","姓名","性别","电话号码","QQ号码","家庭号码","电子邮件","通讯地址","出生日期");
printf("%d%-6s%-3s",f->number,f->name,f->sex);
printf("&-9d%-9d%-9d",f->telephone,f->QQ,f->homenumber);
printf("%-9s%-9s",f->email,f->address);
printf("%d%d%d\n",f->birthday.year,f->birthday.month,f->birthday.day);
f=f->behind; //修正f指向链表中下一项结构数据
} while(f!=NULL);
}
printf("按任意键返回主菜单···");
getchar();
return;
}
//修改通讯录信息
void modify(struct person*f)
{
char name[10];
if(f==NULL)
{printf("\n\n\t\t当前还没有此人信息记录!按任意键返回主菜单···");
getchar();
return;
}
printf("\t请输入姓名:");
gets(name);
while(f!=NULL) //从链表开始向后找
{
if(strcmp(f->name,name)==0)
{
printf("\n\t\t\t此人信息如下:");
printf("\n\t\t\t**************************************\n\n");
printf("% -3S%-9S%-3S%-9S%-9S%-9S%-9S%-9S%-9S","序号","姓名","性别","电话号码","QQ号码","家庭号码","电子邮件","通讯地址","出生日期");
printf("%d%-6s%-3s",f->number,f->name,f->sex);
printf("&-9d%-9d%-9d",f->telephone,f->QQ,f->homenumber);
printf("%-9s%-9s",f->email,f->address);
printf("%d%d%d\n",f->birthday.year,f->birthday.month,f->birthday.day);
//接受此人新信息
printf("\n\t\t请输入此人新电话号码:\n");
scanf("%d",&f->telephone);
printf("\t\t请输入此人新QQ号码:\n");
scanf("%d",&f->QQ);
printf("\t\t请输入此人新家庭号码:\n");
scanf("%d"),&f->homenumber;
printf("\t\t请输入此人新电子邮件:\n");
scanf("%s",&f->email);
printf("\t\t请输入此人新通讯地址:\n");
scanf("%s",&f->address);
printf("\n\n\t\t此人信息修改成功!按任意键返回主菜单···");
getchar();
return;
}
f=f->behind;
}
printf("\n\n\t\t您所输入的人名有误或不存在!按任意键返回主菜单···");
getchar();
return;
}
//向通讯录文件中添加信息记录
struct person*add(struct person*f)
struct person*adddata //记录首地址及新分配内存地址
struct person*p;//中间变量
adddata=(struct person*)malloc(sizeof(struct person));
if(f==NULL) //需创建链表
{
f=adddata;
f->front=NULL;
f->behind=NULL;
}
else //说明需找到链表结束位置
{
p=f;
while(p->behind!=NULL)
{
p=p->behind
}
//建立链表追加项指针指向关系
p->behind=adddata;
adddata->front=p;
adddata->behind=NULL;
}
//无论是创建第一条还是追加信息记录,均只对adddata添加信息
printf("\t请输入序号:");
gets(adddata->number);
printf("\t\t\t\t请输入姓名:");
gets(adddata->name);
printf("\n\t\t\t\t请输入性别:");
gets(adddata->sex);
printf("\n\t\t\t\t请输入电话号码:");
gets(adddata->teltphone);
printf("\n\t\t\t\t请输入QQ号码:");
gets(adddata->QQ);
printf("\n\t\t\t\t请输入家庭电话:");
gets(adddata->homenumber);
printf("\n\t\t\t\t请输入电子邮件:");
gets(adddata->email);
printf("\n\t\t\t\t请输入通讯地址:");
gets(adddata->address);
printf("\n\n\t\t\t\t添加成功!按任意键返回主菜单···");
getchar();
returnh f;//返回 链表首地址
}
//从通讯录文件删除信息记录,用到了双向链表
struct person*del(struct person*f)
{
char name[10];
char d='N'; //接受确认删除字符
struct person*p;//中间变量
p=f;
if(p==NULL) //说明无对应通讯录信息
{
printf("\n\n\t\t当前还没有通讯录信息,无法执行删除!");
printf("\n\n\t\t按任意键返回主菜单···");
getchar();
return f;
}
printf("\t请输入待删除信息人员姓名:");
gets(name);
while(p!=NULL)
{
if(strcmp(p->name,name)==0)
{printf("\n\t\t\t*************************\n\n");
printf("% -3S%-9S%-3S%-9S%-9S%-9S%-9S%-9S%-9S","序号","姓名","性别","电话号码","QQ号码","家庭号码","电子邮件","通讯地址","出生日期");
printf("%d%-6s%-3s",f->num,f->name,f->sex);
printf("&-9d%-9d%-9d",f->telephone,f->QQ,f->homenumber);
printf("%-9s%-9s",f->email,f->address);
printf("%d%d%d\n",f->birthday.year,f->birthday.month,f->birthday.day)
printf("\n\t\t你确认要删除%s的信息吗(y/n)?",p->name);
d=getchar();
if(d=='y'||'Y') //确认删除
{ //重新建立链表关系
if(p->front==NULL&&p->behind==NULL)
//当只有一条记录时
{f=NULL;}
else if(p->front==NULL) //删除的是第一条记录
{ f=p->behind;
f->front=NULL;
}
else if(p->behind==NULL) //删除的是最后一条记录
{
(p->front)->behind=NULL;
}
else //删除非第一条记录
{ (p->front)->behind=p->behind;
(p->behind)->front=p->front;
}
free(p);//释放被删除信息所占内存
printf("\n\n\t\t此人信息删除成功吗,按任意键返回主菜单···");
getchar();
return f;
}
else
{ printf("\n\n\t\t你选择了不删除此人信息,按任意键返回主菜单···");
getchar();
return f;
}
}
p=p->behind;//指向下一项结构
}
if(d='n'||d='N') //该值反映未删除记录的状态
{
printf("\n\t\t本通讯录无此人信息,按任意键返回主菜单···");
getchar();
return f;
}
}
[ 本帖最后由 cyuyan793445 于 2013-3-1 18:35 编辑 ]