新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 C/C++编程思想 』 → 如何用链表来实现的简易通讯录? 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 3707 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 如何用链表来实现的简易通讯录? 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     葛靖青001 美女呀,离线,快来找我吧!水瓶座1984-2-14
      
      
      等级:大三(研究MFC有点眉目了!)
      文章:168
      积分:595
      门派:XML.ORG.CN
      注册:2010/11/2

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给葛靖青001发送一个短消息 把葛靖青001加入好友 查看葛靖青001的个人资料 搜索葛靖青001在『 C/C++编程思想 』的所有贴子 点击这里发送电邮给葛靖青001 引用回复这个贴子 回复这个贴子 查看葛靖青001的博客楼主
    发贴心情 如何用链表来实现的简易通讯录?

    【转自互联网】

    #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;

      }


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    ---人之所以能,是相信能!!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2010/11/30 8:48:00
     
     GoogleAdSense水瓶座1984-2-14
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 点击这里发送电邮给Google AdSense 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/3 6:24:38

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    62.500ms