Intereting Posts
Лучший способ генерировать объект NSData со случайными байтами определенной длины? проблема записи растрового файла заголовка в C C указатель строк против массивов как я могу получить доступ к массивам вне цикла while Извлечение сертификата клиента и закрытого ключа из файла .p12 strcat segmentation fault Почему короткий хранится как 4 байта в структуре в C? Использование каналов в C для родительского дочернего IPC делает программный блок Запуск назначения недействителен для запуска схемы Xcode Строго ли требуется assembly для «самой низкой» части операционной системы? Какие IDE доступны для разработки gtk + Почему использование константы считается лучшим стилем программирования, чем использование литерала? Как использовать fprintf для записи данных в файл C, что мне не хватает для этой программы контрольных операторов? Передача указателя struct на функцию c

Двойной связанный список и указатели 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; } } 

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

 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.