2013-11-25 1 views
0

я написал этот двойной связанный список с недействительными указателямидвойного связанный списка и пустотные указатели [найти метод]

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

Я пытаюсь написать функцию поиска таким образом.

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

где ** l_ptr - указатель на список для поиска, а el - элемент для поиска. Поскольку я пытаюсь сравнить два void * (void * el и void * data), я не знаю, как реализовать сравнение этого типа.

Спасибо.

+0

Вы пытаетесь сравнить указатель или (неизвестный) тип, на который он указывает? Если последний, ответ StoryTeller - это путь вперед. Если вы просто хотите сравнить указатель, используйте '==' так же, как и любой другой тип. – Useless

ответ

2

Попросите пользователя предоставить обратный вызов (указатель на функцию, определенную пользователем) для сравнения его данных. Посмотрите, например, на 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; 
} 
+0

Callback = function pointer – SJuan76

+0

@ SJuan76, два слова используются взаимозаменяемо. – StoryTeller

2

На самом деле я собирался сказать, что, поскольку пустота указатель указывает на адрес, который хранит данные, но тип данных, следовательно, размер неизвестен, вы должны использовать кастинг для того, чтобы сделать это правильно по значению. Я считаю, что единственный способ сделать это - именно так, как предлагает StoryTeller, вы даете пользователю (или, может быть, в этом случае) возможность сравнить данные так, как он хочет, и вернуть -1, 0 или 1.

Смежные вопросы