add linked list searching and the second test

This commit is contained in:
jacekpoz 2024-03-10 22:56:05 +01:00
parent 4245731593
commit fb400dc168
Signed by: poz
SSH key fingerprint: SHA256:JyLeVWE4bF3tDnFeUpUaJsPsNlJyBldDGV/dIKSLyN8
3 changed files with 81 additions and 0 deletions

View file

@ -15,10 +15,18 @@ typedef struct {
Node *current; Node *current;
} LinkedList; } LinkedList;
typedef struct {
bool success;
size_t index;
size_t comparisons;
} SearchResult;
LinkedList linked_list_new(size_t element_size); LinkedList linked_list_new(size_t element_size);
void linked_list_insert(LinkedList *l, void *value); void linked_list_insert(LinkedList *l, void *value);
LinkedList linked_list_merge(LinkedList l1, LinkedList l2); LinkedList linked_list_merge(LinkedList l1, LinkedList l2);
SearchResult linked_list_search(LinkedList l, void *value, int (*compare_values)(void *v1, void *v2));
#endif // _KIK_ZAD2_LINKED_LIST_H #endif // _KIK_ZAD2_LINKED_LIST_H

View file

@ -60,3 +60,23 @@ LinkedList linked_list_merge(LinkedList l1, LinkedList l2) {
return l1; return l1;
} }
SearchResult linked_list_search(LinkedList l, void *value, int (*compare_values)(void *v1, void *v2)) {
SearchResult result;
result.comparisons = 0;
result.index = 0;
result.success = false;
Node *current = l.head;
do {
result.comparisons += 1;
if (compare_values(value, current->value) == 0) {
result.success = true;
break;
}
result.index += 1;
current = current->next;
} while (current != l.head);
return result;
}

View file

@ -32,10 +32,63 @@ void merge_test(void) {
} while (l_node != l.head); } while (l_node != l.head);
} }
int compare_uint64_t(void *v1, void *v2) {
uint64_t u1 = *(uint64_t*)v1;
uint64_t u2 = *(uint64_t*)v2;
if (u1 > u2) {
return 1;
} else if (u1 < u2) {
return -1;
} else {
return 0;
}
}
const size_t T_LENGTH = 10000;
const uint64_t MAX_NUM = 100000;
const size_t TEST_ITERATIONS = 1000;
void average_cost_test(void) {
uint64_t T[T_LENGTH];
LinkedList L = linked_list_new(sizeof(uint64_t));
for (size_t i = 0; i < T_LENGTH; ++i) {
T[i] = (uint64_t)rand() % (MAX_NUM + 1);
linked_list_insert(&L, &T[i]);
}
// searching for randomly chosen elements from T
double average_T_cost = 0.0;
// searching for randomly chosen numbers [0, 100000]
double average_rand_cost = 0.0;
for (size_t i = 0; i < TEST_ITERATIONS; ++i) {
uint64_t t = T[(unsigned long)rand() % T_LENGTH];
uint64_t rand_num = (uint64_t)rand() % (MAX_NUM + 1);
SearchResult t_result = linked_list_search(L, &t, &compare_uint64_t);
SearchResult rand_result = linked_list_search(L, &rand_num, &compare_uint64_t);
average_T_cost += (double)t_result.comparisons;
average_rand_cost += (double)rand_result.comparisons;
}
average_T_cost /= (double)TEST_ITERATIONS;
average_rand_cost /= (double)TEST_ITERATIONS;
printf("average search cost for randomly picked elements from T: %lf\n", average_T_cost);
printf("average search cost for randomly picked numbers from 0 to %ld: %lf\n", MAX_NUM, average_rand_cost);
}
int main(void) { int main(void) {
srand((unsigned int)time(NULL)); srand((unsigned int)time(NULL));
merge_test(); merge_test();
printf("\n\n\n\n\n");
average_cost_test();
return 0; return 0;
} }