0

Следуя этому предыдущему вопросу о Void * on double linked lists Теперь я задаюсь вопросом, как реализовать функцию поиска, которая обрабатывает этот тип связанного списка. я сделал несколько шагов вперед с этим и я немного запутался .. базовая идея заключается в следующемНайти функцию по двойному связанному списку с 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. я думаю, что это нехороший способ ... для решения «void *» я не знаю, изменит ли он что-то, возможно, это будет еще хуже ... поскольку вы можете вывести из моих промахов очень смущенно любая помощь будет полезной ..

Благодаря

+0

Почему функция «неправильная»? Какое поведение вы ожидаете, и что вы получаете? –

ответ

1

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

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

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

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

+0

Вы правы, но могут быть случаи, когда объект, который должен быть найден, является структурой данных, а метод сравнения основан только на поле этой структуры. –

+1

@Buzz - вот для чего обратный вызов сравнения. Вам все равно, почему он возвращает -1, 0 или 1. Только это делает. – StoryTeller

+0

ты прав :) спасибо –