Найти функцию в двусвязном списке с void *

после этого предыдущего вопроса о Void * в двойных связанных списках Теперь мне интересно, как реализовать функцию поиска, которая обрабатывает этот тип связанного списка. я сделал несколько шагов вперед с этим, и я немного смущен ... основная идея заключается в следующем

void find(list_el *el, linked_list *l_ptr )
{
    list_el *p = l_ptr->head;
    while(p != NULL)
    {
       if ((l_ptr->data_compare_func(el->data,p->data)) == 0) /* 0 means exact match*/
       {
           printf("Found\n");
       }
           p = p->next;
    } 
}

то, что сейчас написано, неверно, но я не могу сделать лучше, потому что у меня нет четкого представления о том, как это работает. Я хотел бы сделать его динамическим, и у меня нет идей о том, как лучше обрабатывать параметр el... должен ли я объявить его как list_el или я должен объявить его как void*? проблема может заключаться в том, что если я объявляю его как list_el каждый раз, когда мне нужно вызывать find, мне нужно создать новый list_el, заполнить его и передать методу find. я думаю, что это не очень хороший способ ... для "недействительного * решения", я не знаю, изменит ли это что-то, возможно, это будет даже хуже ... как вы можете сделать вывод из моих бессвязных фраз, любая помощь будет полезна ..

Спасибо


person Giorgio Gambino    schedule 26.11.2013    source источник
comment
Почему функция неверна? Какого поведения вы ожидаете и что получаете?   -  person Some programmer dude    schedule 26.11.2013


Ответы (1)


Конечно, функция find() не должна требовать от вызывающего объекта переноса данных в элемент списка.

Похоже, вы все больше запутались в этом из-за того, что список содержит void * в качестве своих данных, не знаю почему.

Если бы у вас был список int, то я думаю, вы бы ожидали, что функция bool find(const list_el *head, int value); будет искать определенное число. Это не отличается для void *, но, конечно, фактическое сравнение может быть немного более сложным, поскольку менее четко определено, что означает равенство.

Именно поэтому в вашем списке для сравнения используется функция обратного вызова, предоставляемая приложением.

person unwind    schedule 26.11.2013
comment
вы правы, но возможны случаи, когда искомый объект является структурой данных и метод сравнения основан только на поле этой структуры - person Giorgio Gambino; 26.11.2013
comment
@Buzz, для этого и нужен обратный вызов сравнения. Вам все равно, почему он возвращает -1, 0 или 1. Только то, что он делает. - person StoryTeller - Unslander Monica; 26.11.2013