线性探测不适用于碰撞

时间:2017-03-22 08:10:04

标签: c hashtable linear-probing

我正在制作一个基于reg no的哈希表。插入功能正常,但搜索和删除在碰撞时不起作用。它什么都没做。也没有任何编译错误。任何帮助将不胜感激。

int size=4;
struct students
{
    char name[50];
    int regno;
    int age;
    char city[50];
}stud[4];

void insertion()
{
    int reg,k,i;
    printf("\nenter the student details you want to insert:\n");
    printf("\nenter regno: ");
    scanf("%d",&reg);
    k=reg%size;
    if (stud[k].regno==0)
    {
        stud[k].regno=reg;
        printf("\nenter name: ");
        scanf("%s",&stud[k].name);
        printf("\nenter age: ");
        scanf("%d",&stud[k].age);
        printf("\nenter city: ");
        scanf("%s",&stud[k].city);
    }

    else
    {
        for(i=k+1;i<size;i++)
        {
            if (stud[i].regno==0)
            {
                stud[i].regno=reg;
                printf("\nenter name: ");
                scanf("%s",&stud[i].name);
                printf("\nenter age: ");
                scanf("%d",&stud[i].age);
                printf("\nenter city: ");
                scanf("%s",&stud[i].city);
                break;
            }
            else
                for(i=0;i<k;i++)
                {
                    if (stud[i].regno==0)
                    {

                        stud[i].regno=reg;
                        printf("\nenter name: ");
                        scanf("%s",&stud[i].name);
                        printf("\nenter age: ");
                        scanf("%d",&stud[i].age);
                        printf("\nenter city: ");
                        scanf("%s",&stud[i].city);
                        break;
                    }

                }

        }

    }
}

void deletion()
{
    int reg, k;
    int f=0;
    printf("\nenter the student reg no you want to delete");
    scanf("%d",&reg);
    k=reg%size;
    if(stud[k].regno==0)
    {
        printf("\nIt is empty");
    }

    else if(stud[k].regno==reg)
    {
        printf("The removed student is %d",stud[k].regno);
        stud[k].regno=0;
        stud[k].name[0]='\0';
        stud[k].age=0;
        stud[k].city[0]='\0';
        printf("\n\n");

    }

    else
    {   
        int i;
        for (i=k+1;i<size;i++)
        {
            if(stud[k].regno==reg)
            {
                printf("The removed student is %d",stud[k].regno);
                stud[k].regno=0;
                stud[k].name[0]='\0';
                stud[k].age=0;
                stud[k].city[0]='\0';
                printf("\n\n");
                f=1;
                break;
            }

        }

        for(i=0;i<k;i++)
        {
            if (stud[i].regno==reg)
            {
                printf("The removed student is %d",stud[k].regno);
                stud[k].regno=0;
                stud[k].name[0]='\0';
                stud[k].age=0;
                stud[k].city[0]='\0';
                printf("\n\n");
                f=1;
                break;
            }
        }
    }

    if (f==1)
    {
        printf("\nIt is not present");
    }
}


void search()
{
    int reg, k;
    int f=0;
    printf("\nenter the student reg no you want to search");
    scanf("%d",&reg);
    k=reg%size;
    if(stud[k].regno==0)
    {
        printf("\nIt is empty");
    }

    else if(stud[k].regno==reg)
    {
        printf("The student found is: \n");
        printf("\nreg no: %d",stud[k].regno);
        printf("\nname: %s",stud[k].name);
        printf("\nage: %d",stud[k].age);
        printf("\ncity: %s",stud[k].city);
        printf("\n\n");
    }

    else
    {
        int i;
        for (i=k+1;i<size;i++)
        {
            if(stud[k].regno==reg)
            {
                printf("The student found is: \n");
                printf("\nreg no: %d",stud[k].regno);
                printf("\nname: %s",stud[k].name);
                printf("\nage: %d",stud[k].age);
                printf("\ncity: %s",stud[k].city);
                printf("\n\n");
                f=1;
                break;
            }
        }

        for(i=0;i<k;i++)
        {
            if (stud[i].regno==reg)
            {
                printf("The student found is: \n");
                printf("\nreg no: %d",stud[k].regno);
                printf("\nname: %s",stud[k].name);
                printf("\nage: %d",stud[k].age);
                printf("\ncity: %s",stud[k].city);
                printf("\n\n");
                f=1;
                break;
            }
        }

        if (f==1)
        {
            printf("\nIt is not present");
        }
    }
}

void display()
{
    int i;
    for(i=0;i<size;i++)
    {
        printf("\nreg no: %d",stud[i].regno);
        printf("\nname: %s",stud[i].name);
        printf("\nage: %d",stud[i].age);
        printf("\ncity: %s",stud[i].city);
        printf("\n\n");
    }
}

void main()
{
    int i,c;
    for(i=0;i<size;i++)
    {
        stud[i].regno=0;
        stud[i].name[0]='\0';
        stud[i].age=0;
        stud[i].city[0]='\0';
    }

    do {
        printf (" Enter 1 for insert \n");
        printf (" Enter 2 for deletion \n");
        printf (" Enter 3 for search \n");
        printf (" Enter 4 for display \n");
        scanf ("%d", &c);
        switch(c)
        {
            case 1: insertion();
                break;
            case 2: deletion();
                break;
            case 3: search();
                break;
            case 4: display();
        }
    } while(c>0 && c<=4);
}

1 个答案:

答案 0 :(得分:0)

问题在于你的内循环。

        else
            for(i=0;i<k;i++)
            {

i已在使用中,因此您必须使用新变量:

        else
            for(int j=i+1;j<k;j++)
            {

许多地方都存在此错误。

我相信您的代码可以&#34;压缩&#34;。我相信我们的if..else { for..if..else { for..if可以组成一个循环,从reg%size开始搜索第一个空条目。这将是一个优雅的解决方案。