#include <stdlib.h>
#include <stdio.h>
struct node {
struct node *next;
int value;
};
typedef int (*remove_fn) (const struct node *n);
void remove_if_twostar (struct node **first, remove_fn cond, int *count)
{
struct node **prev_next = first;
struct node *cur = *first;
while (cur) {
if (cond(cur)) {
(*count)++;
*prev_next = cur->next;
cur = cur->next;
} else {
prev_next = &cur->next;
cur = cur->next;
}
}
}
void remove_if_onestar (struct node **first, remove_fn cond, int *count)
{
struct node *prev = NULL;
struct node *cur = *first;
while (cur) {
if (cond(cur)) {
(*count)++;
if (prev) {
prev->next = cur->next;
} else {
*first = cur->next;
}
cur = cur->next;
} else {
prev = cur;
cur = cur->next;
}
}
}
void build_twostar (struct node **first, struct node *nodes, size_t num_nodes)
{
struct node **prev_next = first;
for (size_t i = 0; i < num_nodes; i++) {
*prev_next = &nodes[i];
prev_next = &nodes[i].next;
}
*prev_next = NULL;
}
void build_onestar (struct node **first, struct node *nodes, size_t num_nodes)
{
if (num_nodes == 0) {
*first = NULL;
} else {
*first = &nodes[0];
for (size_t i = 0; i < num_nodes - 1; i++) {
nodes[i].next = &nodes[i + 1];
}
nodes[num_nodes - 1].next = NULL;
}
}
int remove_func (const struct node *n)
{
return rand() > RAND_MAX
/ 2; }
int main (int argc, char *argv[])
{
if (argc != 3) {
printf("Need two arguments.\n"); return 1;
}
size_t num_nodes
= atoi(argv
[1]); int num_iter
= atoi(argv
[2]);
struct node
*nodes
= malloc(num_nodes
* sizeof(nodes
[0]));
int all_count = 0;
for (int i = 0; i < num_iter; i++) {
struct node *first;
build_onestar(&first, nodes, num_nodes);
remove_if_onestar(&first, remove_func, &all_count);
}
printf("Total removed: %d\n", all_count
);
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCnN0cnVjdCBub2RlIHsKICAgIHN0cnVjdCBub2RlICpuZXh0OwogICAgaW50IHZhbHVlOwp9OwoKdHlwZWRlZiBpbnQgKCpyZW1vdmVfZm4pIChjb25zdCBzdHJ1Y3Qgbm9kZSAqbik7Cgp2b2lkIHJlbW92ZV9pZl90d29zdGFyIChzdHJ1Y3Qgbm9kZSAqKmZpcnN0LCByZW1vdmVfZm4gY29uZCwgaW50ICpjb3VudCkKewogICAgc3RydWN0IG5vZGUgKipwcmV2X25leHQgPSBmaXJzdDsKICAgIHN0cnVjdCBub2RlICpjdXIgPSAqZmlyc3Q7CiAgICAKICAgIHdoaWxlIChjdXIpIHsKICAgICAgICBpZiAoY29uZChjdXIpKSB7CiAgICAgICAgICAgICgqY291bnQpKys7CiAgICAgICAgICAgICpwcmV2X25leHQgPSBjdXItPm5leHQ7CiAgICAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmV2X25leHQgPSAmY3VyLT5uZXh0OwogICAgICAgICAgICBjdXIgPSBjdXItPm5leHQ7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHJlbW92ZV9pZl9vbmVzdGFyIChzdHJ1Y3Qgbm9kZSAqKmZpcnN0LCByZW1vdmVfZm4gY29uZCwgaW50ICpjb3VudCkKewogICAgc3RydWN0IG5vZGUgKnByZXYgPSBOVUxMOwogICAgc3RydWN0IG5vZGUgKmN1ciA9ICpmaXJzdDsKICAgIAogICAgd2hpbGUgKGN1cikgewogICAgICAgIGlmIChjb25kKGN1cikpIHsKICAgICAgICAgICAgKCpjb3VudCkrKzsKICAgICAgICAgICAgaWYgKHByZXYpIHsKICAgICAgICAgICAgICAgIHByZXYtPm5leHQgPSBjdXItPm5leHQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAqZmlyc3QgPSBjdXItPm5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3VyID0gY3VyLT5uZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHByZXYgPSBjdXI7CiAgICAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKICAgICAgICB9CiAgICB9Cn0KCnZvaWQgYnVpbGRfdHdvc3RhciAoc3RydWN0IG5vZGUgKipmaXJzdCwgc3RydWN0IG5vZGUgKm5vZGVzLCBzaXplX3QgbnVtX25vZGVzKQp7CiAgICBzdHJ1Y3Qgbm9kZSAqKnByZXZfbmV4dCA9IGZpcnN0OwogICAgCiAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9ub2RlczsgaSsrKSB7CiAgICAgICAgKnByZXZfbmV4dCA9ICZub2Rlc1tpXTsKICAgICAgICBwcmV2X25leHQgPSAmbm9kZXNbaV0ubmV4dDsKICAgIH0KICAgIAogICAgKnByZXZfbmV4dCA9IE5VTEw7Cn0KCnZvaWQgYnVpbGRfb25lc3RhciAoc3RydWN0IG5vZGUgKipmaXJzdCwgc3RydWN0IG5vZGUgKm5vZGVzLCBzaXplX3QgbnVtX25vZGVzKQp7CiAgICBpZiAobnVtX25vZGVzID09IDApIHsKICAgICAgICAqZmlyc3QgPSBOVUxMOwogICAgfSBlbHNlIHsKICAgICAgICAqZmlyc3QgPSAmbm9kZXNbMF07CiAgICAgICAgCiAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1fbm9kZXMgLSAxOyBpKyspIHsKICAgICAgICAgICAgbm9kZXNbaV0ubmV4dCA9ICZub2Rlc1tpICsgMV07CiAgICAgICAgfQogICAgICAgIAogICAgICAgIG5vZGVzW251bV9ub2RlcyAtIDFdLm5leHQgPSBOVUxMOwogICAgfQp9CgppbnQgcmVtb3ZlX2Z1bmMgKGNvbnN0IHN0cnVjdCBub2RlICpuKQp7CiAgICByZXR1cm4gcmFuZCgpID4gUkFORF9NQVggLyAyOwp9CgppbnQgbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgaWYgKGFyZ2MgIT0gMykgewogICAgICAgIHByaW50ZigiTmVlZCB0d28gYXJndW1lbnRzLlxuIik7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICAKICAgIHNpemVfdCBudW1fbm9kZXMgPSBhdG9pKGFyZ3ZbMV0pOwogICAgaW50IG51bV9pdGVyID0gYXRvaShhcmd2WzJdKTsKICAgIAogICAgc3RydWN0IG5vZGUgKm5vZGVzID0gbWFsbG9jKG51bV9ub2RlcyAqIHNpemVvZihub2Rlc1swXSkpOwogICAgCiAgICBpbnQgYWxsX2NvdW50ID0gMDsKICAgIAogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1faXRlcjsgaSsrKSB7CiAgICAgICAgc3RydWN0IG5vZGUgKmZpcnN0OwogICAgICAgIGJ1aWxkX29uZXN0YXIoJmZpcnN0LCBub2RlcywgbnVtX25vZGVzKTsKICAgICAgICByZW1vdmVfaWZfb25lc3RhcigmZmlyc3QsIHJlbW92ZV9mdW5jLCAmYWxsX2NvdW50KTsKICAgIH0KICAgIAogICAgcHJpbnRmKCJUb3RhbCByZW1vdmVkOiAlZFxuIiwgYWxsX2NvdW50KTsKICAgIAogICAgcmV0dXJuIDA7Cn0K