使用按引用调用删除链接列表中的节点

时间:2014-11-25 19:44:57

标签: c linked-list pass-by-reference

所以我在这里碰到了一堵墙。我有一个main.c程序,它使用链接列表,并在某些点传递要从列表中删除的节点的值。踢球者应该通过引用来调用它。我相当肯定(比如...... 85%)我已经获得了移除节点功能所需的所有东西,但我可能只是没有正确实现它。

所以这是我的List.c文件中的所有其他函数派生自的初始化函数:

// Call by reference
// This is a linked list without dummy head node!
void init(List *alist, int (*fComp)(void *, void *), void (*fPrint)(void *), void (*fFree)(void *))
{
    if(alist != NULL)
    {
        alist->head = NULL;
        alist->tail = NULL;
        alist->size = 0;
        alist->cmpData = fComp;
        alist->printData = fPrint;
        alist->freeData = fFree;
    }
    else
    {
        printf("Invalid NULL list pointer passed in!\n");
    }
}

这是我的removeNode函数:

int removeNode(List *alist, void *obj){
Node *cur, *prev = alist->head, *start = (*alist).head;
void *temp = obj;

if(temp == cur) {
    alist->head = cur->next;
    free(cur);
    return 1;
}

else if(obj != alist->head) {
    for (cur = start->next; cur != NULL; cur = cur->next) {
        if (alist->cmpData(cur->data, temp) == 0) {
            prev->next = cur->next;
            free(cur);
            return 1;
        } // end if
        prev = cur;
    } // end for
} // end else if

return 0;
} // end removeNode

"列出* alist"和" void * obj"是链接列表元素和要删除的元素,分别是从main.c传入的元素。该函数应该使用来自init函数的cmpData(需要传递两个void指针)来比较正在查看的当前元素与要删除的元素,然后如果删除它则返回1或者如果它没有&#则返回0 39;吨

感谢您提前获取任何帮助!

更新 所以我的代码发布现在是我必须工作的代码。它按预期删除节点。但是,我有足够的free()吗?我有一个内存泄漏检查程序,它一直告诉我在这里需要两个free(),而且它似乎特别是removeNode函数,因为我的程序中没有其他地方被标记。

0 个答案:

没有答案