我正在用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不兼容,因此无法编译此代码。我该如何克服这个问题?
答案 0 :(得分:3)
要使功能签名兼容,您的removeObject
必须接受通用指针并将其正确转换:
void removeObject(void *vptr) {
Object *object = (Object *)vptr;
free(object->ptr);
free(object);
}