#include #include #include #include "skiplist.h" #include "x.h" #define MAXBUF 80 #define KEYCNT 1000000 int dodebug = 1; int main(int argc, char **argv) { slist sl; int key; sl_node *x; int res; int i; int keys[KEYCNT]; int failed = 0; int cntnew; int cntsame; /* char foo[MAXBUF]; sl_init(&sl); sl_print(&sl); printf("addition\n"); while (fgets(foo, MAXBUF - 1, stdin) != NULL) { if (foo[0] == '\n') { break; } key = atoi(foo); sl_add(&sl, key, NULL); sl_print(&sl); } printf("search\n"); while (fgets(foo, MAXBUF - 1, stdin) != NULL) { if (foo[0] == '\n') { break; } key = atoi(foo); x = sl_find(&sl, key); if (x) { printf("found: %d\n", x->key); } else { printf("not found\n"); } } printf("remove\n"); while (fgets(foo, MAXBUF - 1, stdin) != NULL) { if (foo[0] == '\n') { break; } key = atoi(foo); res = sl_remove(&sl, key); sl_print(&sl); if (res) { printf("removed\n"); } else { printf("not found\n"); } } sl_free(&sl); */ sl_init(&sl); dodebug = 0; failed = 0; cntnew = cntsame = 0; for (i = 0; i < KEYCNT; ++i) { key = random() % KEYCNT; keys[i] = key; res = sl_add(&sl, key, NULL); switch(res) { case SL_ADD_NEW: ++cntnew; break; case SL_ADD_SAME: ++cntsame; break; default: failed = 1; break; } } printf("added %d new keys, %d same keys, list len: %lu\n", cntnew, cntsame, sl.len); sl_stat_print(&sl); dodebug = 1; sl_print(&sl); dodebug = 0; cntnew = cntsame = 0; for (i = 0; i < KEYCNT; ++i) { key = keys[i]; x = sl_find(&sl, key); if (!x) { failed = 1; ++cntnew; } else { ++cntsame; } } if (failed) { fatal("find failed, report bug\n"); } printf("should find %d keys but didn't, %d found keys, list len: %lu\n", cntnew, cntsame, sl.len); sl_stat_print(&sl); cntnew = cntsame = 0; for (i = 0; i < KEYCNT; ++i) { key = keys[i]; res = sl_remove(&sl, key); switch (res) { case 0: ++cntsame; break; case 1: ++cntnew; break; default: break; } if (sl_find(&sl, key)) { failed = 1; break; } } if (failed) { fatal("remove failed, report bug\n"); } printf("removed %d keys, %d same keys, list len: %lu\n", cntnew, cntsame, sl.len); sl_stat_print(&sl); sl_free(&sl); return 0; }