标题:用C语言写的通讯录,高手帮忙看看哈哈哈
取消只看楼主
cyuyan793445
Rank: 1
来 自:江门五邑大学
等 级:新手上路
帖 子:20
专家分:0
注 册:2013-1-12
结帖率:100%
已结贴  问题点数:20 回复次数:0 
用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 编辑 ]
搜索更多相关主题的帖子: include person 通讯录 modify 个人信息 
2013-03-01 18:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-399484-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.276627 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved