m0_56390311 2021-06-28 09:35 采纳率: 41.7%
浏览 21
已结题

C语言这个程序怎么修改才能成功创建散列表

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 11
#define HASHSIZE 53 
typedef char data[max];
typedef struct elem{
    data name;
    data tel;
    data add;
}record;
typedef struct slb{
    int size;
    int length;
    record* elem; 
}slb;
int eq(data x,data y)
{
    if(strcmp(x,y)==0)
    return 1;
    else return 0;
}
int number;
void scanfdata(record *a)
{   int i;
    printf("输入要添加的个数:\n");
    scanf("%d",&number);
    for(i=0;i<number;i++)
    {
    printf("请输入第%d个记录的用户名:\n",i+1);
        scanf("%s",a[i].name);
        printf("请输入%d个记录的电话号码:\n",i+1);
        scanf("%s",a[i].tel);
        printf("请输入第%d个记录的地址:\n",i+1);
        scanf("%s",a[i].add);


    }
}
void show(record *a)
{
    int i;
    for(i=0;i<number;i++)
    printf("\n第%d个用户信息:\n 姓名:%s\n 电话号码:%s\n 联系地址:%s\n",i+1,a[i].name,a[i].tel,a[i].add);
}
int fold(data s)
{
    char *p;
    long sum=0;
    data ss;
    strcpy(ss,s);
    strupr(ss);
    p=ss;
    while(*p!='\0')
    sum+=*p++;
    return sum;
}
int hashm(data str)
{ long n;int m;
n=fold(str);
m=n%HASHSIZE;
return m;
    
}
int hashd(data str)
{int m;long n;
n=atoi(str);
m=n%HASHSIZE;
return m;
}

int collision(int p,int &c)
{
    int i,q;
    i=c/2+1;
    while(i<HASHSIZE)
    {
        if(c%2==0)
        {
            c++;;
            q=(p+i*i)%HASHSIZE;
            if(q>=0)return q;
            else i=c/2+1;
        }
        else
        {
        q=(p-i*i)%HASHSIZE;
        c++;
        if(q>=0)return q;
        else i=c/2+1;
        }
    }
    return -1;
}
void create1(slb &a,record *b)
{   
    int i,p,c,pp;
    for(i=0;i<number;i++)
    {
        c=0;
        p=hashm(b[i].name);
        pp=p;
        while(a.elem[pp].name!='\0')
        {
            pp=collision(p,c);
            if(pp<0)
            {
                printf("第%d记录无法解决冲突",i+1);
                break;
            }
        }
        a.elem[pp]=b[i];
        a.length++;
    }
    printf("\n建表完成!\n"); 
}
void search1(slb a,int &c)
{
    data str;
    printf("\n请输入要查找记录的姓名:\n");
    scanf("%s",str);
    int p,pp;
    p=hashm(str);
    pp=p;
    while((a.elem[pp].name!='\0')&&(eq(str,a.elem[pp].name)==0))
    pp=collision(p,c);
    if(a.elem[pp].name!='\0'&&eq(str,a.elem[pp].name)==1)
    {
        printf("\n成功\n");
        printf("姓名 %s\n电话 %s\n地址 %s\n,",a.elem[pp].name,a.elem[pp].tel,a.elem[pp].add);

    }
    else printf("\n查无此人\n");
}
void create2(slb &a,record *b)
{int i,p=-1,c,pp;
for(i=0;i<number;i++)
{
    c=0;
    p=hashd(b[i].tel);
    pp=p;
    while(a.elem[i].tel!='\0')
    {
        pp=collision(p,c);
        if(pp<0)
        {
            printf("失败");
            break; 
        }
    }
    a.elem[pp]=b[i];
    a.length++;
}
    
}
void search2(slb a,int &c)
{
    data tele;
    printf("\n输入电话:\n");
    scanf("%s",tele);
    int p,pp;
    p=hashd(tele);
    pp=p;
    while((a.elem[pp].tel!='\0')&&(eq(tele,a.elem[pp].tel)==-1))
    pp=collision(p,c);
    if(a.elem[pp].tel!='\0'!='\0'&&eq(tele,a.elem[pp].tel)==1)
    {
        printf("姓名:\n%s\n电话:%s\n地址:%s\n",a.elem[pp].name,a.elem[pp].tel,a.elem[pp].add); 
    }
    else printf("不存在");
}
int main()
{
    int c,flag=1;
    slb h;
    h.elem=(record*)malloc((max)*sizeof(record));
    h.size=max;
    h.length=0;
    record a[max];
    printf("                欢迎使用电话号码查找系统             ");
    printf("\n 1.  添加用户信息                         ");
    printf("\n 2.  读取所有用户信息                     ");
    printf("\n3.  以姓名建表                           ");
    printf("\n 4.  以电话号码建表                       ");
    printf("\n5.  查找并显示给定用户名的记录           ");
    printf("\n6.  查找并显示给定电话号码的记录         ");
    printf("\n7.  退出程序                             ");
    printf("\n       注意:                                         ");
    printf("\n             Ⅰ.进行5操作前 请先输出3               ");
    printf("\n             Ⅱ.进行6操作前 请先输出4               ");
    printf("\n");
    printf("请输入你想要的操作:");
    printf("\n");
while(1)
{
    int num;
    scanf("%d",&num);
    switch(num)
    {
        case 1:
            scanfdata(a);
            break;
        case 2:
        show(a);
        break;
        case 3:
        create1(h,a);
        break;
        case 4:
        create2(h,a);
        break;
        case 5:
        c=0;
        search1(h,c);
        break;
        case 6:
        c=0;
        search2(h,c); 
        break;
        case 7:
            return 0;
            break;
        default:
        printf("输入错误,重输");
        printf("\n"); 
    }
    
}
return 0;
}
 

  • 写回答

2条回答 默认 最新

  • 有问必答小助手 2021-06-30 11:22
    关注

    你好,我是有问必答小助手,非常抱歉,本次您提出的有问必答问题,技术专家团超时未为您做出解答

    本次提问扣除的有问必答次数,已经为您补发到账户,我们后续会持续优化,扩大我们的服务范围,为您带来更好地服务。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
  • 有问必答小助手 2021-09-21 13:17
    关注
    您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
    PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月29日
  • 已采纳回答 9月21日

悬赏问题

  • ¥15 如何通过求后验分布求得样本中属于两种物种其中一种的概率?
  • ¥15 q从常量变成sin函数,怎么改写python代码?
  • ¥15 图论编程问题,有可以指导的吗
  • ¥15 DEA的CCR模型画图
  • ¥15 请假各位一个关于安卓车机的问题
  • ¥15 光谱仪怎么看这样的透射谱
  • ¥15 pyqt5 如何实现输入框输入关键词,下拉框显示模糊查询返回的结果?
  • ¥20 fluent模拟,可以燃烧和相变同时模拟吗?
  • ¥50 海康摄像头,C#如何识别车牌号码和抓取JPG
  • ¥15 yolov5 pt转engine的问题