C 双链接列表和空指针[查找方法]

C 双链接列表和空指针[查找方法],c,pointers,void,void-pointers,doubly-linked-list,C,Pointers,Void,Void Pointers,Doubly Linked List,我用空指针写了这个双链接列表 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; /*p

我用空指针写了这个双链接列表

 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),所以我不知道如何实现这种类型的比较


谢谢。

请用户提供回调(指向用户定义的函数的指针)以比较其数据。例如,请看

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;
}

要求用户提供一个回调(指向用户定义的函数的指针),用于比较其数据。例如,请看

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;
}

实际上,我想说的是,由于一个空指针指向一个保存数据的地址,但是数据类型(因此大小)是未知的,所以您必须使用强制转换才能正确地按值执行。我认为唯一好的方法就是按照StoryTeller的建议,你给用户(或者在本例中是你)一种可能性,让用户按照他想要的方式比较数据,然后返回-1、0或1。

实际上我想说的是,由于一个空指针指向一个保存数据的地址,但数据类型和大小是未知的,你必须使用铸造来正确地按价值进行铸造。我认为唯一好的方法就是按照StoryTeller的建议,你给用户(或者在本例中你)一种可能性,让用户可以按照他想要的方式比较数据,然后返回-1、0或1。

你是在尝试比较指针,还是它指向的(未知)类型?如果是后者,说书人的答案就是前进的方向。如果您只想比较指针,请使用与任何其他类型相同的
=
。您是要比较指针还是它指向的(未知)类型?如果是后者,说书人的答案就是前进的方向。如果您只想比较指针,请使用与任何其他类型相同的
=
。@SJuan76,确实可以互换使用两个术语。@SJuan76,确实可以互换使用两个术语。