您的位置:首页 > 汽车及配件 > 汽配 > 通讯录——c语言程序

通讯录——c语言程序

luyued 发布于 2011-05-25 08:16   浏览 N 次  

  /************************************************* ************************/

  /*************************** 通讯录 ************************************/

  /************************************************* ************************/

  //头文件

  #include

  #include

  #include

  #include

  //定义结构体

  typedef struct student

  { char phonenum[15],name[20],add[35];} elemtype;

  //定义结点

  struct node

  {elemtype data; node * next;};

  //定义整体变量

  char PRINT='0',MOD='0',DESE='0',SEARCH='0',C;

  //PRINT=='Y'表示显示所有时的标志,作为控制空格之用

  //MOD=='J'表示用卷页模式

  //MOD=='G'表示用滚条模式

  //SEARCH=='N'表示在通讯录中没找到相应的信息

  //DESE=='D'表示使用删除功能时要输出的提示语

  //DESE=='S'表示使用查询功能时要输出的提示语

  //子函数

  void beginmenu();//开始菜单

  void modmenu();//模式选择

  void importmenu();//菜单--导入文件

  void readfromfile();//文件导入

  void createsl();//产生一个单链表

  void mainmenu();//主菜单选择

  void showall();//输出单链表

  void searchmemu();//查询菜单

  node* searchnum();//按序号查询

  node* searchbynpa();//按名字、电话号码、地址查询

  void deletemenu();//删除菜单

  void deletebynpan();//按名字、电话号码、地址、序号删除

  void deleteall();//删除所有信息

  void insertmenu();//插入菜单----插入一条信息(按序号插入)

  void listmenu();//排序菜单

  void savemenu();//菜单--保存到文件

  void writetofile();//写入文件

  void exitmenu();//退出菜单选择

  //输入数据元素

  void pread(elemtype *x)

  { printf("\t请输入学生的 姓名 电话号码 地址: ");

  scanf("%s%s%s",x->name,x->phonenum,x->add);

  fflush(stdin);

  };

  //输出数据元素

  void pwrite(elemtype *x)

  {if(PRINT!='Y')printf("\t\t");

  printf("%-15s%-20s%-35s\n",x->name,x->phonenum,x->add );}

  //计算通讯录中的信息条数

  int count(node *h)

  {int i=0; node *p=h;

  while(p->next!=NULL){ p=p->next; i++; }

  return(i);

  }

  //实现在卷页模式的第一行都输出"卷页模式"

  void write()

  { if(MOD=='J')

  {system("cls"); printf("*******************************");

  printf("**** 卷页模式 *********************************\n\n");

  }

  }

  //错误提示

  void error()

  {printf("\n\n\t\t ----------");getch();}

  //获取输入字符,并输出非回车字符,与getch()类似,这样定义之后在函数中就无需定义字符

  void get_C()

  {C=getch(); if(C!=13)putchar(C);}

  /**************************创建与输出******************************/

  //单链表的产生

  void createsl(node **h)

  {node *p,*s;

  elemtype x;

  *h=(node*)malloc(sizeof(node));

  (*h)->next=NULL;

  system("cls");

  printf("\t********************< 现在开始创建通讯录 >********************\n\n");

  C='Y';

  while(C=='y'||C=='Y')

  { pread(&x);

  s=(node*)malloc(sizeof(node));

  s->data=x;

  if((*h)->next==NULL) (*h)->next=s;

  else p->next=s;

  p=s;

  while(1)

  {printf("\n\t是否继续 Y/N : "); get_C();

  if(C=='Y'||C=='y'||C=='N'||C=='n') {printf("\n\n");break;}

  else {error();printf("\n");continue;}

  }

  }

  p->next=NULL;

  printf("\t按任意键进入模式选择");getch();

  }

  //单链表的输出

  void showall(node **h)

  {node *p;int i=0;p=*h;

  if(p->next==NULL||p==NULL) {printf("\t该通讯录为空!!!\n");return;}

  printf("\n\t*************************** 通讯录 **************************\n\n");

  printf("\t序号 姓名 电话号码 地址\n\n");

  while(p->next!=NULL)

  {PRINT='Y';printf("%10d\t",i+1);pwrite(&p->next->dat a);i++;p=p->next;}

  printf("\t**************************************** ***********************");

  printf("\n\n\t共%d条信息\n",i);

  PRINT='N';

  }

  /*************************** 文件的导入与输出 **************************/

  //从文件导入

  void readfromfile(node **h)

  { FILE *fp;int i=0;

  if((fp=fopen("TXL.txt","r"))==NULL)

  { printf("\n\n\t\t通讯录文件不存在");

  if((fp=fopen("TXL.txt","w"))==NULL)

  {printf("\n\n\t\t建立失败");exit(0);}

  else

  {printf("\n\n\t\t通讯录文件已建立");

  printf("\n\n\t\t按任意键开始创建通讯录");

  getch();

  *h=NULL;

  return;

  }

  }

  fseek(fp,0,2);/*文件位置指针移动到文件末尾*/

  if (ftell(fp)>0) /*文件不为空*/

  { node *p,*k; elemtype x;

  rewind(fp);

  fscanf(fp,"%s%s%s\n",x.name,x.phonenum,x.add);

  *h=(node*)malloc(sizeof(node));

  k=(node*)malloc(sizeof(node));

  *h=k;

  while(!feof(fp))

  {p=(node*)malloc(sizeof(node));

  fscanf(fp,"%s%s%s\n",p->data.name,p->data.phonenum,p ->data.add);

  k->next=p;

  k=p;

  p->next=NULL;

  p=p->next;

  }

  printf("\n\n\t\t文件导入成功");

  printf("\n\n\t\t按任意键进入模式选择");

  getch();

  return;

  }

  printf("\n\n\t\t文件导入成功");

  printf("\n\n\t\t通讯录文件中无任何纪录");

  printf("\n\n\t\t按任意键开始创建通讯录");

  *h=NULL;

  fclose(fp);

  getch();

  return;

  }

  //保存到文件

  void writetofile(node*h)

  { node *p=h->next;

  FILE *fp=fopen("TXL.txt","w");

  if(fp==NULL) printf("\n\t\t文件打开失败");

  fprintf(fp,"姓名\t\t 电话号码\t\t地址\n\n");

  while (p!=NULL)

  {fprintf(fp,"%-20s%-20s%-20s\n",p->data.name,p->data .phonenum,p->data.add);

  p=p->next;}

  fclose(fp);

  printf("\n\n\t\t通讯录文件已保存\n");

  }

  //菜单--从文件导入

  void importmenu(node**h)

  { system("cls");

  printf("\n\n\n\n\n\n\t\t★※☆※★※☆※★※☆※★※☆※★※☆※★");

  printf("\n\n\t\t是否导入已有文件 TXL.txt --Y/N -- ");

  printf("\n\n\t\t★※☆※★※☆※★※☆※★※☆※★※☆※★\n\n\t\t\t\t ");

  get_C();

  if(C=='y'||C=='Y'){readfromfile(h);if(*h==NULL)cre atesl(h);}

  else if(C=='n'||C=='N') createsl(h);

  else {error();importmenu(h);}

  }

  //菜单--保存到文件

  void savemenu(node *h)

  {printf("\n\t\t是否保存到文件TXL.txt --Y/N -- "); get_C();

  if(C=='y'||C=='Y') writetofile(h);

  else if(C=='n'||C=='N') printf("\n\n\t\t文件未保存!!!\n");

  else {error();printf("\n");savemenu(h);}

  }

  /******************************退出菜单**************************/

  void exitmenu(node *h)

  {printf("\n\n\t\t确定退出!!! --Y/N-- "); get_C();

  if(C=='y'||C=='Y') {printf("\n\t\t");savemenu(h);printf("\n\t\t");exi t(0);}

  else if(C=='n'||C=='N') printf("\n");

  else {error();exitmenu(h);}

  }

  /************************************** 修改 ****************************************/

  void modify(node *p)

  {SIGN1:printf("\n\t是否修改信息内容 --Y/N-- "); get_C();

  if(C=='n'||C=='N') {putch('\n');return;}

  else if(C=='y'||C=='Y')

  {if(MOD=='J') system("cls");

  printf("\n\n\t\t******************* 修改 *********************");

  printf("\n\t\t********* 1--修改名字 2--修改电话号码 ******");

  printf("\n\t\t********* 3--修改地址 4--退出修改 ******");

  printf("\n\t\t************************************ ************\n\t请选择:");

  get_C();printf("\n\n\t请输入:");

  switch(C)

  {case '1':scanf("%s",p->data.name);break;

  case '2':scanf("%s",p->data.phonenum);break;

  case '3':scanf("%s",p->data.add);break;

  case '4':printf("\n\t\t");return;

  default:{error();modify(p);break;}

  }

  }

  else {error();putch('\n\n');goto SIGN1;}

  }

  /****************************查询功能*****************************/

  //单链表的查找与输出(按序号)

  node * searchbynum(node *h)

  { node *p; int i,j;

  while(1)

  {p=h;

  printf("\n\t请输入信息序号(只允许输入数字) i :");

  scanf("%d",&i);

  for(j=1;jnext!=NULL;j++) p=p->next;

  if(p->next!=NULL&&i>0) break;

  else

  { while(1)

  {printf("\n\t输入的位置 i 不合理,是否继续选择位置 --Y/N-- ");get_C();

  if(C=='y'||C=='Y') {printf("\n");break;}

  else if(C=='n'||C=='N') {SEARCH='N';printf("\n");return(NULL);}

  else {error();printf("\n");}

  }

  }

  }

  if(DESE=='D') return(p);

  printf("\n\t你要查找的学生信息为:\n");

  printf("\n\t\t姓名 电话号码 地址\n\n");

  pwrite(&p->next->data);

  modify(p->next);

  }

  //单链表的查找与输出(按名字、电话号码、地址)

  node* searchbynpa(node *h,char c)

  { node *p=h;// p 指向查到信息的前一条信息

  char data[35]; int i=1;

  printf("\n\t请输入: ");

  scanf("%s",data);fflush(stdin);

  while(p->next!=NULL&&i!=0)

  { switch(c)

  {case '1':i=strcmp(data,p->next->data.name);break;

  case '2':i=strcmp(data,p->next->data.phonenum);break;

  case '3':i=strcmp(data,p->next->data.add);break;

  }

  if(i!=0) p=p->next;

  }

  if(p->next==NULL){printf("\n\t在通讯录中查无此信息!!!\n");SEARCH='N';return(p);}

  switch(DESE)

  {case 'S': printf("\n\t你要查找的学生信息为:\n");

  printf("\n\t\t姓名 电话号码 地址\n\n");

  pwrite(&p->next->data);modify(p->next);

  return(NULL);break;

  case 'D': return(p);

  }

  }

  //查询菜单

  void searchmenu(node *h)

  {DESE='S';

  if(h->next==NULL)

  {printf("\n\n\n\t\t通讯录为空!!!");getch();printf("\n\t\t");return;}

  printf("\n\n\t\t******************* 查询 *********************");

  printf("\n\t\t******* 1-- 按名字查询 2-- 按电话号码查询 *****");

  printf("\n\t\t******* 3-- 按地址查询 4-- 按序号查询 *****");

  printf("\n\t\t******* 5-- 退出查询 *****");

  printf("\n\t\t************************************ ************\n\t请选择:");

  get_C();printf("\n");

  switch(C)

  {case '1':

  case '2':

  case '3':searchbynpa(h,C);break;

  case '4':searchbynum(h);break;

  case '5':printf("\n\t\t");return;

  default :error();write();searchmenu(h);break;

  }

  DESE='0';

  }

  /************************** 删除功能 ********************************/

  //按名字、电话号码、地址、序号删除

  void deletebynpan(node *h,char c)

  { node *s,*p;

  if(c=='4') p=searchbynum(h);

  else p=searchbynpa(h,C);

  if(p->next!=NULL) {s=p->next;p->next=s->next;free(s);}

  }

  //删除全部

  void deleteall(node *h)

  {node *p=h, *q;

  printf("\n\n\t要全部删除吗:--Y/N-- "); get_C();

  if(C=='y'||C=='Y')

  {while (p->next!=NULL){q=p->next;p->next=q->next;free(q);}

  printf("\n\n\t通讯录中的信息已全部删除!!!\n");

  }

  else if(C=='n'||C=='N') {putchar('\n');return;}

  else {error();deleteall(h);}

  }

  //删除菜单

  void deletemenu(node *h)

  {DESE='D';SEARCH='0';

  if(h->next==NULL) {printf("\n\n\n\t通讯录为空!!!");getch();printf("\n\t\t");return;}

  printf("\n\n\t\t******************* 删除 *********************");

  printf("\n\t\t********* 1--按名字删除 2--按电话号码删除 *****");

  printf("\n\t\t********* 3--按地址删除 4--按序号删除 *****");

  printf("\n\t\t********* 5--全部删除 6--退出删除 *****");

  printf("\n\t\t************************************ ************\n\t请选择:");

  get_C();

  if(MOD=='J'&&(C=='1'||C=='2'||C=='3'||C=='4'))

  {printf("\n\n\t按任意键进入");getch();

  system("cls");printf("\n\t删除前的通讯录为:\n");showall(&h);}

  switch(C)

  {case '1':

  case '2':

  case '3':

  case '4':deletebynpan(h,C);break;

  case '5':deleteall(h);break;

  case '6':printf("\n\t\t");return;

  default:{error();write();deletemenu(h);break;}

  }DESE='0';

  if(SEARCH!='N'&&(C=='1'||C=='2'||C=='3'||C=='4'))

  {if(h==NULL||h->next==NULL) {printf("\n\t删除后的通讯录为空\n");return;}

  else {if(MOD=='J') system("cls");

  printf("\n\t删除后的通讯录为:\n");

  showall(&h);

  }

  }

  }

  /************************* 插入功能(按顺序) ***************************/

  void insertmenu(node *h)

  {elemtype x; node *p,*t;

  if(C=='4')printf("\t※※※※※※※※※※※※※※※ 插入 ※※※※※※※※※※※※※※\n\n\n");

  printf("\n\t输入你要添加的信息的内容:\n\n");

  pread(&x);

  DESE='D';

  p=searchbynum(h);

  if(p==NULL)return;

  t=(node*)malloc(sizeof (node));

  t->data=x;

  t->next=p->next;

  p->next=t;

  while(1)

  { printf("\n\t是否继续添加--Y/N-- "); get_C();

  if(C=='n'||C=='N')

  {write();printf("\n\n\t修改后的通讯录为:\n");showall(&h);return;}

  else if(C=='y'||C=='Y') {printf("\n");insertmenu(h);}

  else {error();printf("\n");}

  }

  }

  /****************************** 排序功能 *******************************/

  void listmenu(node *h)

  {node *p,*t,*s;int n;int k;

  printf("\t\t******************* 排序 *********************");

  printf("\n\t\t********* 1--按名字排序 2--按电话号码排序 *****");

  printf("\n\t\t********* 3--按地址排序 4--退出排序 *****");

  printf("\n\t\t************************************ ************\n\t请选择:");

  get_C();

  if(C=='1'||C=='2'||C=='3')

  {if(MOD=='J') {MOD='0';system("cls");}//改下模式这样才能显示排序前的通讯录

  printf("\n\n\t排序前的通讯录为:\n");showall(&h);

  n=count(h);

  for(int i=1;i

  {p=h;

  for(int j=1;j<=n-i;j++)

  {s=p->next;

  t=p->next->next;

  switch(C)

  {case '1':k=strcmp(s->data.name,t->data.name);break;

  case '2':k=strcmp(s->data.phonenum,t->data.phonenum);brea k;

  case '3':k=strcmp(s->data.add,t->data.add);break;

  }

  if(k==1){s->next=t->next;p->next=t;t->next=s;}

  p=p->next;

  }

  }

  printf("\n\n\t排序后的通讯录为:\n");showall(&h);

  if(MOD=='0') MOD='J';//将模式改正过来

  }

  else if(C=='4'){printf("\n\t\t");return;}

  else{error();listmenu(h);}

  }

  /******************************** 模式选择 ************************/

  void modmenu()

  { system("cls");

  printf("\n\n\n\n\n\n\t\t★※☆※★※☆※★※☆※★※☆※★※☆※★");

  printf("\n\n\t\t选择浏览模式: G--滚条 J--卷页 ");

  printf("\n\n\t\t★※☆※★※☆※★※☆※★※☆※★※☆※★\n\n\t\t\t\t ");

  get_C();

  if(C=='G'||C=='g') {MOD='G';system("cls");}

  else if(C=='j'||C=='J') MOD='J';

  else{error();modmenu();}

  }

  /********************************主菜单***********************************/

  void mainmenu(node *h)

  { while(1)

  {write();

  printf("\n\n\t\t******************* 主菜单 *******************");

  printf("\n\t\t********** 1-- 显示 2-- 查询 **********");

  printf("\n\t\t********** 3-- 删除 4-- 插入 **********");

  printf("\n\t\t********** 5-- 排序 6-- 保存 **********");

  printf("\n\t\t********** 7-- 返回 8-- 退出 **********");

  printf("\n\t\t************************************ ************");

  printf("\n\t请选择:");

  get_C(); char c=C;

  if(MOD=='J') printf("\n");

  if(h->next==NULL&&(C=='1'||C=='2'||C=='3'||C=='5'))

  {printf("\n\n\n\n\t\t该通讯录为空,只有'插入'功能能用,按任意键返回!!!");

  getch();

  mainmenu(h);

  }

  printf("\n");

  if(C>='1'&&C<='5')write();

  switch(C)

  {case '1': showall(&h);break;

  case '2': searchmenu(h);break;

  case '3': deletemenu(h);break;

  case '4': insertmenu(h);break;

  case '5': listmenu(h);break;

  case '6': savemenu(h);break;

  case '7': modmenu();break;

  case '8': exitmenu(h);break;

  default : printf("\n\t输入错误!!!\n");break;

  }

  if(c!='7'){printf("\n\t按任意键进入主菜单: --- ");getch();}

  }

  }

  /***************************** 开始界面 ****************************/

  void beginmenu()

  { printf("\n\n\n\n\n\n\t\t★☆●◎★☆●◎★☆●◎★☆●◎★☆●◎★☆\n\n\t\t\t ");

  printf("欢迎使用 HNN 版通讯录");

  printf("\n\n\t\t★☆●◎★☆●◎★☆●◎★☆●◎★☆●◎★☆\n\n\n\n\t\t\t\t");

  getch();//按任意键进入

  }

  /*****************************主函数*********************************/

  void main()

  { node *h;

  beginmenu();//开始菜单

  importmenu(&h);//菜单--导入文件

  modmenu();//模式选择菜单

  mainmenu(h);//主菜单

  }

  /******************************结束*********************************/

图文资讯
广告赞助商