编写一个函数
undef,它将从lookup和install维护的文件中删除一个名称和一个定义。
这是我的解决方案:
void undef(char *name)
{
struct Nlist *tmp = hashtab[hash(name)];
if(!strcmp(tmp->name, name)) { // delete the head node
hashtab[hash(name)] = tmp->next;
free(tmp->name);
free(tmp);
return;
}
for(; strcmp(tmp->next->name, name); tmp = tmp->next)
;
struct Nlist *save = tmp->next; // save the desired node for deletion
tmp->next = tmp->next->next; // adjust the links
free(save->name);
free(save);
}主要病例有2例。第一种是当我们想要删除head节点时,以及当我们想从列表的其余部分中删除一个节点时。
在第二种情况下,我将解释我的函数是如何工作的。for循环将运行,直到tmp将指向所需节点之前的节点。然后调整链接并释放所需节点占用的内存。
如果所需的值位于head节点,则此方法不太好,因此我使用if-statement检查所需的值是否位于head节点。如果是的话,我调整头部指针并释放内存。
下面是整个程序的代码:http://ideone.com/t0bjiA。
发布于 2014-04-19 22:20:17
如果你以一种不同的方式来考虑这个问题的话,你就没有必要把它作为单子的头像。特别是,hashtable中的每个条目都是指向Nlist结构的指针,因此如果您使用hashtable条目的地址,您可以像对待任何其他节点一样对待它。具体来说,您可以使用以下内容:
void undef(char *name)
{
struct Nlist **tmp = &hashtab[hash(name)];
struct Nlist *old;
/* find our matching node */
for ( ; *tmp && strcmp(name, (*tmp)->name); tmp=&((*tmp)->next));
/* if we have found it, delete and adjust pointer */
if (*tmp != NULL) {
old = *tmp;
free(old->name);
free(old->defn);
*tmp = old->next;
free(old);
}
}还请注意,defn未在原始代码中被删除,从而导致内存泄漏。
https://codereview.stackexchange.com/questions/47661
复制相似问题