从 C 中的通用 (void *) 列表中删除元素

Erasing elements from generic (void *) list in C

我正在用 C 编写一个通用的双向链表。

typedef struct ListNode {
    void *data;
    struct ListNode *prev;
    struct ListNode *next;
} ListNode;

typedef struct List {
    struct ListNode *head;
    struct ListNode *tail;
} List;

将元素插入列表只需

listNode->data = data;

其中listNode是某个列表元素,data是要插入的数据。所以我正在做一个浅拷贝。现在,当我想从列表中删除某些内容时,我希望能够执行深拷贝,所以我有一个函数可以对传递给列表的对象执行深度删除。我想将指向此函数的指针作为参数传递给删除列表成员的函数。下面给出一个例子。

typedef struct Object {
    int *ptr;
} Object;

void removeObject(Object *object) {
    free(object->ptr);
    free(object);
}

void removeListNodeFromList(List *list, ListNode *listNode,
                               void (*removeEntry)(void *data)) {
    // Code handling removing listNode from list
    // ...

    removeEntry(listNode->data);
    free(listNode);
}

void fun() {
    List *list = NULL;
    ListNode *listNode = NULL;
    // Some code giving specific value to list and listNode
    // ...

    removeListNodeFromList(list, listNode, removeObject);
}

此代码无法编译,因为(最后一行代码)removeObject 与 removeEntry 不兼容。我该如何解决这个问题?

为了使函数签名兼容,您的 removeObject 必须接受通用指针并适当地转换它:

void removeObject(void *vptr) {
    Object *object = (Object *)vptr;
    free(object->ptr);
    free(object);
}