m0_56390311 2021-06-27 21:03 采纳率: 41.7%
浏览 25
已结题

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;
    int sum=0;
    data ss;
    strcpy(ss,s);
    strupr(ss);
    p=ss;
    while(*p!='\0')
    sum+=*p++;
    return sum;
}
int hashm(data str)
{ int n,m;
n=fold(str);
m=n%HASHSIZE;
return m;
    
}
int hashd(data str)
{int m,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);
                continue;
            }
        }
        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("失败");
            continue; 
        }
    }
    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;
}

  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2021-06-27 22:06
    关注
    while(a.elem[pp].name!='\0')
            {
                pp=collision(p,c);
                if(pp<0)
                {
                    printf("第%d记录无法解决冲突",i+1);
                    continue;
                }
            }

    这段代码有点诡异,如果pp<0,你continue的话,while不会崩溃么?elem数组下标是负数啊

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效