双链表和void指针

我用void指针写了这个双链表

typedef struct list_el { void *data; struct list_el *prev; struct list_el *next; } list_el; typedef struct linked_list { int n_el; /*number of elements*/ list_el * head; /*pointer to the head*/ list_el * tail; /*pointer to the head*/ } linked_list; 

我写了这些函数来处理它。

 /*for list_el allocation*/ list_el * new_el ( void ) { return (list_el *) malloc(sizeof(list_el)); } /*list initialization*/ void init_list(linked_list **l_ptr) { (*l_ptr) = (linked_list * )malloc(sizeof(linked_list)); (*l_ptr)->n_el = 0; (*l_ptr)->head = NULL; (*l_ptr)->tail = NULL; } /*head insertion*/ void append(void *data , linked_list **l_ptr) { list_el *nv; nv = new_el(); nv->data = data; if((*l_ptr)->n_el == 0 ) { nv->next = nv->prev = NULL; (*l_ptr)->head = (*l_ptr)->tail = nv; (*l_ptr)->n_el += 1; } else { nv->next = (*l_ptr)->head; (*l_ptr)->head->prev = nv; (*l_ptr)->head = nv; (*l_ptr)->n_el += 1; } } 

我试图用这种方式编写一个find函数。

 void * find(void * el , linked_list ** l_ptr); 

其中** l_ptr是要搜索的列表的指针,el是要搜索的元素。 因为我想比较两个void *(void * el和void * data)我不知道如何实现这种类型的比较。

谢谢。

要求用户提供回调(指向用户定义的函数的指针)以比较他的数据。 以qsort为例。

 typedef int (*linked_list_compare)(void*, void*); typedef struct linked_list { int n_el; /*number of elements*/ list_el * head; /*pointer to the head*/ list_el * tail; /*pointer to the head*/ linked_list_compare data_compare_func; } linked_list; void init_list(linked_list **l_ptr, linked_list_compare compare_func) { if (!l_ptr || !compare_func) return; /* You should do error checking and error reporting */ (*l_ptr) = (linked_list * )malloc(sizeof(linked_list)); (*l_ptr)->n_el = 0; (*l_ptr)->head = NULL; (*l_ptr)->tail = NULL; (*l_ptr)->data_compare_func = compare_func; } 

实际上我会说,由于void指针指向一个保存数据的地址,但数据类型因此大小未知,您必须使用转换才能按值正确执行。 我认为这样做的唯一好方法就是StoryTeller建议的方式,你给用户(或者在这种情况下你可能)以他想要的方式比较数据并返回-1,0或1。