Commit ae26ee41 authored by Нестеренко Алексей Юрьевич's avatar Нестеренко Алексей Юрьевич :headphones:
Browse files

Добавлена функция ak_list_add_node_sorted()

parent 91258c82
No related merge requests found
Showing with 49 additions and 2 deletions
+49 -2
......@@ -3,7 +3,9 @@
## Изменения в версии 0.9.15
- В библиотеку libakrypt-base добавлена функция ak_time_to_str()
- В библиотеку libakrypt-base добавлены функции
- ak_time_to_str()
- ak_list_add_node_sorted()
- Добавлена поддержка опции сборки библиотеки, отвечающей за дополнительные проверки
корректной работы ряда криптографических алгоритмов
......
......@@ -293,7 +293,49 @@
list->current = node;
}
list->count++;
return ak_error_ok;
return ak_error_ok;
}
/* ----------------------------------------------------------------------------------------------- */
/*! @details Функция вставляет указатель в список, одновременно сортируя его.
* Для сортировки указателей успользуется пользовательская функция.
* @param list Указатель на контекст двусвязного списка
* @param node Добавляемый элемент двусвязного списка
* @param compare Функция, выполняющая сравнение данных,
* должна возвращать значения аналогично функции strcmp().
* @return В случае успеха функция фозвращает ноль (ak_error_ok). В противном случае,
* возвращается код ошибки */
/* ----------------------------------------------------------------------------------------------- */
int ak_list_add_node_sorted( ak_list list, ak_list_node node, ak_function_compare_ptr compare )
{
if( !list ) return ak_error_message( ak_error_null_pointer,
__func__, "using null pointer to list context" );
if( !node ) return ak_error_null_pointer;
if( !compare ) return ak_error_message( ak_error_null_pointer,
__func__, "using null pointer to compare function" );
ak_list_first( list );
if( list->current == NULL ) list->current = node;
else { /* начинаем обход списка */
do{
if( compare( list->current->data, node->data ) >= 0 ) { /* вставляем перед текущим */
if(( node->prev = list->current->prev ) != NULL ) {
node->prev->next = node;
}
node->next = list->current;
list->current->prev = node;
goto exlab;
}
} while( ak_list_next( list ));
/* здесь просто добавляем элемент в конец списка */
node->prev = list->current;
list->current->next = node;
list->current = node;
}
exlab:
list->count++;
return ak_error_ok;
}
/* ----------------------------------------------------------------------------------------------- */
......
......@@ -365,6 +365,7 @@ extern "C" {
/* ----------------------------------------------------------------------------------------------- */
/*! \brief Функция, выполняющая операции по удалению объекта из памяти */
typedef ak_pointer ( ak_function_delete_object )( ak_pointer );
typedef int ( ak_function_compare_ptr )( ak_const_pointer, ak_const_pointer );
/* ----------------------------------------------------------------------------------------------- */
/*! \brief Двусвязный список. */
......@@ -410,6 +411,8 @@ extern "C" {
dll_export ak_pointer ak_list_delete( ak_list );
/*! \brief Добавление нового узла к двусвязному списку. */
dll_export int ak_list_add_node( ak_list , ak_list_node );
/*! \brief Добавление нового узла к двусвязному списку. */
dll_export int ak_list_add_node_sorted( ak_list , ak_list_node , ak_function_compare_ptr );
/** @} */
/* ----------------------------------------------------------------------------------------------- */
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment