C 为未排序的泛型数组创建泛型搜索函数

C 为未排序的泛型数组创建泛型搜索函数,c,generics,search,vector,C,Generics,Search,Vector,我正在用C语言创建带有函数和数据结构的个人泛型库 我有一个通用向量 typedef struct vector { int max; int size; void **data; } vector_t; 我为vector创建了函数: int vector_new( vector_t * v, int vecsize ); int vector_add( vector_t *v , void *elem ); int vector_remove( vector_t * v, void

我正在用C语言创建带有函数和数据结构的个人泛型库

我有一个通用向量

typedef struct vector
{
  int max;
  int size;
  void **data;
} vector_t;
我为vector创建了函数:

int vector_new( vector_t * v, int vecsize );
int vector_add( vector_t *v , void *elem );
int vector_remove( vector_t * v, void *elem);
void vector_free( vector_t *v );
remove函数的实现中,当且仅当元素尚未出现在数据数组中时,我才添加元素。 我创建了一个函数搜索(因为我不想对插入的元素进行排序),以查找可能的重复项

我对必须传递给函数的第一个参数的类型有疑问。我想创建函数搜索不仅用于此用途,而且用于一般用途

在remove()中,我这样调用它:
search(v->data,elem),,
但该功能的原型将如何实现呢

int search( ??? , void * e );
我知道第一个参数可以是数组。但我不知道是一个
void*
还是一个
void**

重要的是,此函数不仅适用于我创建的结构和函数。

我会执行
int搜索(void**array,unsigned int size,void*data)
这是因为您总是在指针数组中搜索(不管指向什么),所以
void*
数组看起来是正确的。

你可能还想想想比较是怎么做的。如果它是指针之间的一个简单的
=
,那么它相当简单。但是如果你需要其他的东西,它可能会更复杂。

我会做
int搜索(void**array,unsigned int size,void*data)
这是因为您总是在指针数组中搜索(不管指向什么),所以
void*
数组看起来是正确的。


你可能还想想想比较是怎么做的。如果它是指针之间的一个简单的
=
,那么它相当简单。但是如果您需要其他东西,它可能会更复杂。

听起来您需要定义一个函数指针来比较向量中的元素是否相等。然后可以将其作为参数添加到搜索方法中

typedef bool (*vector_equals)(void* pLeft, void* pRight);
int vector_search(vector_t* v, vector_equals callback);
现在让我们假设我有一个包含
int
值的向量。我可以这样定义我的回调

bool vector_int_equals(void* left, void* right) {
  int* intLeft = left;
  int* intRight = right;
  return *left == * right;
}

听起来您需要定义一个函数指针来比较向量中的元素是否相等。然后可以将其作为参数添加到搜索方法中

typedef bool (*vector_equals)(void* pLeft, void* pRight);
int vector_search(vector_t* v, vector_equals callback);
现在让我们假设我有一个包含
int
值的向量。我可以这样定义我的回调

bool vector_int_equals(void* left, void* right) {
  int* intLeft = left;
  int* intRight = right;
  return *left == * right;
}

为什么返回类型都是int?vector_new()返回指向vector_t的指针,vector_seach返回void*(或NULL)似乎是合乎逻辑的。{add,remove}函数可能返回错误代码或结果代码。如果一切正常,我将返回0,如果有错误,则返回-1。在函数搜索中,我返回数组中找到的元素的索引-1如果没有。为什么返回类型都是int?vector_new()返回指向vector_t的指针,vector_seach返回void*(或NULL)似乎是合乎逻辑的。{add,remove}函数可能返回错误代码或结果代码。如果一切正常,我将返回0,如果有错误,则返回-1。在函数搜索中,我返回数组中找到的元素的索引-1如果没有,你想用“更复杂”怎么说?例如字符字符串??如果比较不能由
==
完成,但在某些情况下需要
strcmp
,而在其他情况下需要
strcmp,则比较复杂。JaredPar的回答讨论了这一点。你想用“更复杂”来表达什么?例如字符字符串??如果比较不能由
==
完成,但在某些情况下需要
strcmp
,而在其他情况下需要
strcmp,则比较复杂。JaredPar的回答讨论了这一点。