c - 线性探测不适用于碰撞

标签 c hashtable linear-probing

我正在根据注册号制作哈希表。插入功能工作正常,但在发生冲突时搜索和删除不起作用。它根本没有做任何事情。也没有任何编译错误。任何帮助将不胜感激。

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);
}

最佳答案

问题出在你的内部循环中。

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

i 已经被使用,所以你必须使用一个新变量:

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

这个错误出现在很多地方。

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

关于c - 线性探测不适用于碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42945976/

相关文章:

c - 在程序结束时释放 malloc 的良好做法?

c - C 逐行读取并存储在数组中

c - switch 还是 const table 更好? (嵌入式软件)

c# - 具有单个键的多个值的哈希表

java - 在java中使用什么集合来存储具有相同哈希码的多个对象?

java - 请分享一些关于java中的rehash方法的见解?

c++ - 在 C++ 中为泛型实现线性探测

algorithm - hash中什么是主次聚类?

c - 指向数组的指针,分配数组

algorithm - 散列中的聚类(在碰撞中)是什么意思?