c中的通用数据结构搜索

时间:2018-02-28 19:46:30

标签: c generics data-structures structure

我试图在c。中编写完全通用的数据结构库 c编程中是否有任何方法或技术可以在不知道其类型的情况下搜索数据? 在这里,我必须再次根据我的数据类型定义我的比较函数。

list.h


typedef struct _node
{
   void *data;
   struct _node *next;
}NODE;

typedef struct _list
{
   NODE *head;
   NODE *tail;
   NODE *current;
}GLIST;

int search(GLIST *list,void *data,int (*COMPARE)(void*,void*));

list.c

int search(GLIST *list,void *data,int(*COMPARE)(void*,void*))
{
   list->current=list->head;
   int cIndex=1;
   while(list->current)
   {
       if(COMPARE(list->current->data,data))
       {
           printf("data found at position %i.\n",cIndex);
           if(list->current->next==NULL)
           {
               return 1;
           }
       }
       list->current=list->current->next;
       cIndex++;
   }
   printf("NO DATA FOUND.\n");

   return 0;
}

mycode.c

int compare(void *list,void *data);

typedef struct _student
{
   int studentNumber;
   char name[64];
}STUDENT;

int main()
{
  GLIST list;
  //initializing list......
  STUDENT stud;
  //code .....
  search(&list,&stud,compare) // I want an alternative of using compare here

  search(&list,&stud);     // want the function be like this and also be generic !

  return 0;
}


int compare(void *list,void *data)
{ 
    // I do not wanna have to declare this function even 
   return !strcmp(((STUDENT*)list)->name,((STUDENT*)data)->name);
}

我想知道是否存在比较元素"结构,联合,数组和#34;在c或任何其他技术上。

1 个答案:

答案 0 :(得分:4)

在不知道数据类型的情况下,无法比较两个对象。

首次尝试可能会使用类似memcmp的内容,但这至少有三个原因失败:

  1. 在不知道类型的情况下,您不知道对象的大小。
  2. 即使您以某种方式获得某种大小,比较structunion类型的对象也可能因填充而导致错误的结果。
  3. 基于内存布局的比较最多可以实现"浅"比较,可能并不代表平等"就各自的数据类型而言。
  4. 因此,唯一的方法(通用库使用它)是定义接受用户定义的比较函数作为参数的函数。