m0_63919794 2021-12-23 13:51 采纳率: 100%
浏览 13
已结题

大家好,请问一下这个代码要怎么改才能将用姓名和电话号码都可以查询信息

大家好,请问一下这个代码要怎么改才能将用姓名和电话号码都可以查询信息


```c++
#include<iostream>
#include<math.h>
#include<cstring>
#include<fstream>
#include<iomanip> 
using namespace std;
#define maxsize 20
#define ok 1
#define error 0

typedef struct{     //通讯录信息数据类型 
 long long int number;
 char name[20];
 char address[20];
}infor;

typedef struct{     //哈希表的创建函数 
 infor *elem;
 int length;
}hashtable;

int Inithash(hashtable &h)  //初始化哈希表 
{
 h.elem = new infor[maxsize];
 if(!h.elem)
  exit(0);
 h.length = maxsize; 
 for(int i = 0; i < maxsize; i++)
  h.elem[i].number = 0;
 return ok; 
}

int hash(long long int key) //求关键词的值 
{
 return int(key%100/5);
}

int Inserthash(hashtable &h,infor e)  //插入哈希表 
{
 int i,j = 1;
 i = hash(e.number);
 if(h.elem[i].number == 0){
  strcpy(h.elem[i].address,e.address);
  strcpy(h.elem[i].name,e.name);
  h.elem[i].number = e.number;
 }
 else{
  while(1)
  {
   if(i + j*j < 20 && i + j*j >= 0){
    if(h.elem[i + j*j].number == 0){
     strcpy(h.elem[i + j*j].address,e.address);
     strcpy(h.elem[i + j*j].name,e.name);
     h.elem[i + j*j].number = e.number;
     break;
    }
    else{
     if(i - j*j < 20 && i - j*j > 0){
      if(h.elem[i - j*j].number == 0){
       strcpy(h.elem[i - j*j].address,e.address);
       strcpy(h.elem[i - j*j].name,e.name);
       h.elem[i - j*j].number = e.number;
       break;
      }
      else{
       j++;
       continue;
      }
     }
     else{
      j++;
      continue;
     }
    }
   }
   else{
    j++;
    continue;
   }
  }
 }  
} 

int searchhash(hashtable h,long long int number,infor &e)  //查找号码所对应的信息 
{
 int i,j = 1;
 i = hash(number);
 if(h.elem[i].number == number){
  strcpy(e.address,h.elem[i].address);
  strcpy(e.name,h.elem[i].name);
  e.number = h.elem[i].number;
 }
 else{
  while(1)
  {
   if(i + j*j < 20 && i + j*j >= 0){
    if(h.elem[i + j*j].number == number){
     strcpy(e.address,h.elem[i + j*j].address);
     strcpy(e.name,h.elem[i + j*j].name);
     e.number = h.elem[i + j*j].number;
     break;
    }
    else{
     if(i - j*j < 20 && i - j*j > 0){
      if(h.elem[i - j*j].number == number){
       strcpy(e.address,h.elem[i - j*j].address);
       strcpy(e.name,h.elem[i - j*j].name);
       e.number = h.elem[i - j*j].number;
       break;
      }
      else{
       j++;
       continue;
      }
     }
     else{
      j++;
      continue;
     }
    }
   }
   else{
    j++;
    continue;
   }
  }
 }
} 

int main()
{
 ofstream ofile;
 ofile.open("d:\\myfile.txt");
 hashtable h;
 Inithash(h);
 infor e;
 while(1){
  cout<<"-------------------------------------"<<endl;
  cout<<"功能选项:1.录入    2.查找     3.退出"<<endl;
  cout<<"-------------------------------------"<<endl;
  cout<<"输入功能选项:";
  int i;
  cin>>i;
  if(i == 1){
    cout<<"输入电话号码:";
    cin>>e.number;
    cout<<"输入姓名:";
    cin>>e.name;
    cout<<"输入地址:";
    cin>>e.address;
    Inserthash(h,e);
    ofile<<e.number<<"  "<<e.name<<"  "<<e.address<<endl;
   }
   
        else if(i == 2){
    cout<<"输入待查找号码:";
    cin>>e.number;
    infor e2;
    searchhash(h,e.number,e2);
    cout<<"该号码主人姓名:";
    cout<<e2.name<<endl;
    cout<<"该号码主人住址:";
    cout<<e2.address<<endl;
   }
  else if(i == 3){
   cout<<"成功退出系统!";
   break;
  }
  else
   cout<<"指令错误!"<<endl; 
 }
 return 0;
} 

```

  • 写回答

1条回答 默认 最新

  • 於黾 2021-12-23 14:01
    关注

    输入的变量用字符串来存,不要写进e.number里面
    searchhash函数里判断if(e.number==str || e.name==str)//注意这里是伪代码,不能直接用==去判断,如果是数字要转int型,如果是名字要用strcmp去比较

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月31日
  • 已采纳回答 12月23日
  • 创建了问题 12月23日

悬赏问题

  • ¥100 c语言,请帮蒟蒻看一个题
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)