我是 C 的新手,我正在尝试实现一个链表,其节点定义如下:
typedef struct _cListNode
{
void *_data; //generic pointer to any data type
struct _cListNode *next; //next node in the list
} cListNode;
我需要 InsertElement(cList myList, void *dataToInsert) 函数在插入的元素已经存在(即没有重复)时不增加列表。我目前的问题是我找不到一种方法来比较 dataToInsert(参数)和 _data(在我的节点内)。
我想在调用 InsertElement 函数之前从外部遍历列表,并在列表实现之外处理比较,我知道类型是什么,但我希望有更好的设计/解决方案。
最佳答案
给定两个空指针,不可能比较它们的数据。这是因为您不知道每个指针类型的大小。如果你想比较它们的数据,那么你需要存储指针和它们的数据大小。然后你可以使用 memcmp 来比较指向的内存:
typedef struct _cListNode
{
void *_data; //generic pointer to any data type
size_t size;
struct _cListNode *next; //next node in the list
} cListNode;
int memcmp ( const void * ptr1, const void * ptr2, size_t num );
所以:
memcmp(node_data_ptr, new_data_ptr, size_of_item_pointed_at);
只有当两个指针的大小相同时才应该执行 memcmp,否则它们明显不同并且您不希望最终比较无效内存。
您的另一个选择是比较指针本身,看看它们是否指向相同的内存部分。这取决于您所说的“重复”是什么意思。
关于c - 需要在 C 中实现通用列表,避免插入时重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14402476/