首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >undef函数的实现

undef函数的实现
EN

Code Review用户
提问于 2014-04-19 17:12:33
回答 1查看 80关注 0票数 2

编写一个函数undef,它将从lookupinstall维护的文件中删除一个名称和一个定义。

这是我的解决方案:

代码语言:javascript
复制
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

EN

回答 1

Code Review用户

回答已采纳

发布于 2014-04-19 22:20:17

如果你以一种不同的方式来考虑这个问题的话,你就没有必要把它作为单子的头像。特别是,hashtable中的每个条目都是指向Nlist结构的指针,因此如果您使用hashtable条目的地址,您可以像对待任何其他节点一样对待它。具体来说,您可以使用以下内容:

代码语言:javascript
复制
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未在原始代码中被删除,从而导致内存泄漏。

票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/47661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档