c - 需要在 C 中实现通用列表,避免插入时重复

标签 c comparison linked-list void-pointers

我是 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/

相关文章:

c - C 是否像 python 一样支持 a , b = 0, 1 类型的多重赋值?

c - 使用 QtCreator [mac os] 找不到 -lrt 的库

php - 多维数组中特定键的数组差异

c++ - Klocwork 提示无符号与零的比较总是正确的——为什么?

java - 使用 swap 方法反转泛型 LinkedList

c++ - c++中的循环链表问题

algorithm - 混淆了以下算法的空间复杂度

C-从文件中读取以字符开头的行

c++ - 将 void 指针增加一个字节?两个?

java - 如何从两个单独的 ArrayList 中删除重复的对象?