无法从连接到hashtable的列表中删除元素

发布于 2025-01-20 23:06:58 字数 827 浏览 0 评论 0原文

我有一个实现链接冲突的哈希表。我有这个函数 void Elimina ,它应该用于从列表中消除一个元素,但该函数不会消除第一个元素。对于其他元素,效果很好。我该如何解决?

void elimina() {
    int chiave, a;
    printf("\nQuale elemento vuoi elimiare?\n");
    scanf("%d", &chiave);
    a = chiave % DIM_TABELLA;
    c = head[a];
    struct nodo *newnodo = (struct nodo *)malloc(sizeof(struct nodo));
    newnodo->next = c;

    if (head[a] == NULL)
        printf("\nL'elemento non esiste");
    else {
        if (c->next->info == chiave) {
            c = c->next;
            free(c);
        } else
        if (c->next != NULL) {
            while (c->info != chiave) {
                b = c;
                c = c->next;
            }
        }
        if (c) {
            b->next = c->next;
            free(c);
        }
    }
}

I have a hashtable that implement chaining collision. I have this function void elimina that should be used to eliminate an element from a list but the function doesn't eliminate the first element. For the other elements it works fine. How can I solve it?

void elimina() {
    int chiave, a;
    printf("\nQuale elemento vuoi elimiare?\n");
    scanf("%d", &chiave);
    a = chiave % DIM_TABELLA;
    c = head[a];
    struct nodo *newnodo = (struct nodo *)malloc(sizeof(struct nodo));
    newnodo->next = c;

    if (head[a] == NULL)
        printf("\nL'elemento non esiste");
    else {
        if (c->next->info == chiave) {
            c = c->next;
            free(c);
        } else
        if (c->next != NULL) {
            while (c->info != chiave) {
                b = c;
                c = c->next;
            }
        }
        if (c) {
            b->next = c->next;
            free(c);
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

落日海湾 2025-01-27 23:06:58

多个问题:

  • 无需在此功能中分配新节点。
  • 在免费c之前,您不会链接下一个节点,
  • 如果第一个节点与键匹配,则永远不会测试。
  • 您应该使用一个未签名的数字,以便操作始终返回正数。

这是一个修改版本:

void elimina(void) {
    printf("\nQuale elemento vuoi eliminare?\n");
    unsigned int chiave;
    if (scanf("%u", &chiave) != 1)
        return;
    unsigned int a = chiave % DIM_TABELLA;
    struct node *c = head[a];
    if (c == NULL) {
        printf("L'elemento non esiste\n");
        return;
    }
    if (c->info == chiave) {
        /* free the first node */
        head[a] = c->next;
        free(c);
    } else {
        while (c->next && c->next->info != chiave) {
            c = c->next;
        }
        if (c->next) {
            struct node *p = c->next;
            c->next = p->next;
            free(p);
        } else {
            printf("L'elemento non esiste\n");
        }
    }
}

Multiple problems:

  • There is no need to allocate a new node in this function.
  • You do not link the next node before you free c
  • You never test if the first node matches the key.
  • You should use an unsigned number so the % operation always returns a positive number.

Here is a modified version:

void elimina(void) {
    printf("\nQuale elemento vuoi eliminare?\n");
    unsigned int chiave;
    if (scanf("%u", &chiave) != 1)
        return;
    unsigned int a = chiave % DIM_TABELLA;
    struct node *c = head[a];
    if (c == NULL) {
        printf("L'elemento non esiste\n");
        return;
    }
    if (c->info == chiave) {
        /* free the first node */
        head[a] = c->next;
        free(c);
    } else {
        while (c->next && c->next->info != chiave) {
            c = c->next;
        }
        if (c->next) {
            struct node *p = c->next;
            c->next = p->next;
            free(p);
        } else {
            printf("L'elemento non esiste\n");
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文