鱼C论坛

 找回密码
 立即注册
查看: 2475|回复: 1

关于C++编写简单通讯录

[复制链接]
发表于 2012-6-1 13:31:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
       #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #define B_PUT puts("+-----------------------------------------------------------------+");        \
  puts("|姓名                地址                          联系方式       |")
  #define END_PUT puts("+-----------------------------------------------------------------+")
  #define INPUT_NAME puts("请输入联系人姓名:");\
  setbuf(stdin,(char *)0); \
  scanf("%[^\n]",name)//用与修改,查找,删除时,输入name.由于操作频繁,定义为宏
  #define FRESH getchar();\
  getchar()//一个接受上次的Enter,另一个等待输入Enter.用于Press Enter to Continue
  /*存放通讯录信息单链表定义*/
  typedef struct
  {
  char name[20];
  char address[30];
  char tel[20];
  }inf_t;
  typedef struct node
  {
  inf_t date;
  struct node *next;
  }*link;
  inf_t getInf(void);
  void insert(inf_t inf);
  link pop(const char *name,link *pre);
  void del(link pre,link cur);
  void outputOne(link p);
  void output(void);
  void menu(void);
  int save(void);
  void openfile(void);
  link head = NULL;
  inf_t getInf(void) //获取联系人信息
  {
  inf_t t_get;
  char *pch;
  printf("\t联系人姓名:");
  setbuf(stdin,(char *)0);
  scanf("%[^\n]",t_get.name); //存入除换行以外的所有字符
  printf("\t该联系人地址:");
  setbuf(stdin,(char *)0);
  scanf("%[^\n]",t_get.address);
  lableTel:
  printf("\t电话或手机号码:");
  setbuf(stdin,(char *)0);
  scanf("%s",t_get.tel);
  /*处理当号码不为数字的情况*/
  for(pch = t_get.tel; *pch != '\0'; pch++){
  if(*pch < '0' || *pch > '9'){
  puts("该通讯录暂只支持纯数字的电话号码!");
  goto lableTel;
  }
  }
  return t_get;
  }
  void insert(inf_t inf)//创建一个新结点,数据域存放inf,通过头插法插入单链表
  {
  link p = (struct node *)malloc(sizeof *p);
  p->date = inf;
  p->next = head;
  head = p;
  }
    /*匹配单链表中为姓名项为name的节点 pre为指向该节点前一项的指针的指针 */
  link pop(const char *name,link *pre){
  link p = head;
  while(p != NULL){
  if(strcmp(name,p->date.name) == 0){
  return p;
  }
  *pre = p;
  p = p->next;
  }
  return NULL;
  }
  void del(link pre,link cur) //删除cur结点,pre为cur前一个结点
  {
  if(cur == head){
  head = cur->next;
  }
  else pre->next = cur->next;
  free(cur);
  }
  void outputOne(link p)
  {
  printf("|%-20s%-30s%-15s|\n",p->date.name,p->date.address,p->date.tel);
  }
  void output(void)
  {
  link p = head;
  B_PUT;
  while(p != NULL){
  outputOne(p);
  p = p->next;
  }
  END_PUT;
  }
  void menu(void)
  {
  puts("*************欢迎使用简易通讯录*************");
  puts("*\t+-------------------------+        *");
  puts("*\t|       1.添加记录        |        *");
  puts("*\t|       2.删除记录        |        *");
  puts("*\t|       3.查找记录        |        *");
  puts("*\t|       4.修改记录        |        *");
  puts("*\t|       5.显示所有记录    |        *");
  puts("*\t|       0.保存退出        |        *");
  puts("*\t+-------------------------+        *");
  puts("********************************************");
  printf("\t请输入您的选择:");
  }
  int save(void)
  {
  link p;
  FILE *ft = fopen("date.dat","wb");
  if(ft == NULL){
  perror("Savd file date.dat error");
  return 0;
  }
  while(head != NULL){
  fwrite(&head->date,sizeof(inf_t),1,ft);
  fflush(ft);
  p = head;
  head = head->next;
  free(p);//释放掉已存入文件的节点
  }
  fclose(ft);
  return 1;
  }
  void openfile(void)
  {
  inf_t tmp;
  FILE *ft = fopen("date.dat","rb");
  if(ft == NULL){
  perror("Open file date.dat error");
  return ;
  }
  while(fread(&tmp,sizeof(inf_t),1,ft) != 0){
  insert(tmp);
  fflush(ft);
  }
  fclose(ft);
  }
    int main(void)
  {
  char cmd[10],name[15],*pch;
  int n;
  link p,pre = NULL;//p指向当前节点指针,pre指向当前节点前一节点的指针
  openfile();
  do{
  men:        system("cls");
  menu();
  setbuf(stdin,(char *)0);//清空输入流
  scanf("%[^\n]",cmd);//接受除换行以外的所有字符存入cmd中,并加上'\0'标志
  sscanf(cmd,"%d",&n);
  /*处理当命令不符合条件的情况*/
  if(strlen(cmd) != 1 || n < 0 || n > 5 || !(*cmd >= '0' && *cmd <= '9')){
  printf("\t输入错误或没有这个选项!");
  FRESH;
  goto men;
  }
  switch(n){
  case 1:insert(getInf());puts("\t添加成功!");break;
  case 2:
  INPUT_NAME;//提示输入姓名,然后将输入字符串存入name数组中
  if((p = pop(name,&pre)) != 0){
  del(pre,p);
  puts("\t删除成功!");
  }
  else puts("\t未找到任何相关信息!");
  break;
  case 3:
  INPUT_NAME;
  if((p = pop(name,&pre)) != 0){
  puts("\t\t\t找到的记录:");
  B_PUT;//打印通讯录的准备(美观)
  outputOne(p);
  END_PUT;//打印通讯录结束的处理(美观)
  }
  else puts("\t未找到任何相关信息!");
  break;
  case 4:
  INPUT_NAME;
  if((p = pop(name,&pre)) != 0){
  puts("\t\t\t找到的记录:");
  B_PUT;
  outputOne(p);
  END_PUT;
  printf("\t将此联系人地址修改为:");
  setbuf(stdin,(char *)0);
  scanf("%[^\n]",p->date.address);
  lable1:                                printf("\t将此联系人联系方式修改为:");
  setbuf(stdin,(char *)0);
  scanf("%[^\n]",p->date.tel);
  /*处理当号码不为数字的情况*/
  for(pch = p->date.tel; *pch != '\0'; pch++){
  if(*pch < '0' || *pch > '9'){
  puts("该通讯录暂只支持纯数字的电话号码!");
  goto lable1;
  }
  }
  puts("\t修改成功");
  }
  else puts("\t未找到任何相关信息!");
  break;
  case 5:system("cls");output();break;
  case 0:
  if(save() == 0)        puts("\t保存失败!");
  else puts("\t\t保存成功!");
  return 0;
  default :break;
  }
  printf("\tPress Enter To Continue!");
  FRESH;
  }while(n != 0);
  return 0;
  }

报错,但不知道怎么改,求指点

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-6-1 13:41:45 | 显示全部楼层
貌似没有错啊。。。。{:2_38:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 22:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表