skiplist/main.c

144 lines
3.0 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#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;
}