从 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);
}
我正在用 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);
}