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

Unable to delete an element from a list connected to hashtable

我有一个实现链接冲突的哈希表。我有这个函数 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);
        }
    }
}

多个问题:

  • 本函数无需分配新节点
  • 你没有link你释放前的下一个节点c
  • 您永远不会测试第一个节点是否与键匹配。
  • 您应该使用无符号数,这样 % 运算总是 returns 正数。

这是修改后的版本:

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