无法从连接到哈希表的列表中删除元素
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");
}
}
}
我有一个实现链接冲突的哈希表。我有这个函数 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");
}
}
}