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

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条回答

      报告相同问题?

      相关推荐 更多相似问题

      问题事件

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

      悬赏问题

      • ¥15 vs创建SQL Server数据库时出现“系统找不到指定的路径”
      • ¥15 网页超时时间设置失效
      • ¥15 有关绿色信贷毕业论文的问题
      • ¥30 关于#机器人#的问题,如何解决?
      • ¥15 求MATLAB函数ScalarLayerDisplay的代码
      • ¥15 安卓如何自动执行检测到的NFC标签,无需再点确认
      • ¥15 pyHM库mouse模块的ValueError错误
      • ¥15 python opencv 摄像头 传感器
      • ¥30 eMMC&Android&C&Linux
      • ¥15 uniapp ios恢复购买