开发者社区> 问答> 正文

做一个电话号码本,用姓名和电话号码建立两个哈希表,进行查找,添加等操作,不知道自己的代码哪里错了,求助~

   cout << "系统初始化完毕!" << endl;
    while (1)
    {
        cout << "请选择要进行的操作:" << endl;
        cout << "0:增加一条记录" << endl;
        cout << "1:根据输入的姓名搜索记录并输出" << endl;
        cout << "2:根据输入的电话搜索记录并输出" << endl;
        cout << "3:根据姓名查找表输出全部记录" << endl;
        cout << "4:根据电话查找表输出全部记录" << endl;
        cout << "5:退出" << endl;
        cin >> opt;
        switch (opt)
        {
        case 0:
            cin >> name >> add >> tel;
            add_record(name, tel, add);
            break;
        case 1:
            cin >> name;
            QueryByName(name);
            break;
        case 2:
            cin >> tel;
            QueryByTel(tel);
            break;
        case 3:
        {
              int key1 = 0;
              Node *p = hashtable1[key1];
              while (p != NULL)
              {
                 cout << p->user.name << "_" << p->user.add << "_" << p->user.tel << endl;
                  p = p->next;
              }
              break;
        }
            
        case 4:
        {
              int key2 = 0;
              Node *p2 = hashtable2[key2];
              while (p2 != NULL)
              {
                  cout << p2->user.name << "_" << p2->user.add << "_" << p2->user.tel << endl;
                  p2 = p2->next;
              }
              break;
        }
        case 5:
            break;
        default:
            cout << "请输入0-5之间的数字!" << endl;
            break;
        }
    }
    return 0;

}

展开
收起
a123456678 2016-03-09 16:03:35 2793 0
1 条回答
写回答
取消 提交回答
  • 编译器问题,MinGW下把strcpy_s 改成strcpy,貌似strcpy_s 是VS下的
    --更新--
    void QueryByName(char *name),无论是否查询成功都会输出一个NULL,解决方法,第一种在函数内部设立一个bool型的变量做标志,第二种,找到后直接return

    其次有一个问题,第二个选项,你添加纪录的时候,编码用的是hashname编码(也就是你Name,Tel,Add全部都是放在了以Name做索引的那个空间),而你在QueryByTel 里面确实用hashtel 进行解码,对应不来啊。

    --12.5更新--
    你说的改法也可以,但我建议这样

    void QueryByName(char *name)//按姓名查找
    {
     int key1 = hashname(name);
     Node *p = hashtable1[key1];
     while (p != NULL)
     {
      if (strcmp(name, p->user.name)==0)
      {
        cout << p->user.name << "_" << p->user.add << "_" << p->user.tel << endl;
        return;
       }
       p = p->next;
      }
     cout << "NULL" << endl;
    }
    
    或者
    
    bool QueryByName(char *name,Node *&result)//按姓名查找
    {
        int key1 = hashname(name);
        Node *p = hashtable1[key1];
        while (p != NULL)
        {
            if (strcmp(name, p->user.name)==0);
            {
                result = p;
                return true;
            }
            p = p->next;
        }
        return false;
    }

    然后再在主函数里用if判断,是否输出NULL还是reult的成员值

    至于你说说建立了两个哈希表的应该不会混乱的问题
    你的确是建立了两个哈希表,可是你在QueryByTel(char tel)*里是这么写的

    Node *p = hashtable1[key2];
    你访问的还是第一个用名字建立索引的哈希表,应该是

    Node *p = hashtable2[key2];
    还有在add_record(char name, char tel,char add )里面

    int key2 = hashname(tel);
    按照你的意思应该是

    全选复制放进笔记int key2 = hashntel(tel);

    2019-07-17 18:56:22
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载