从C

时间:2019-05-18 12:16:06

标签: c algorithm pointers function-pointers

我正在用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不兼容,因此无法编译此代码。我该如何克服这个问题?

1 个答案:

答案 0 :(得分:3)

要使功能签名兼容,您的removeObject必须接受通用指针并将其正确转换:

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