143 lines
3 KiB
C
143 lines
3 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;
|
|
}
|
|
|