3 Provide three functions to skip_new:
5 This should compare e1 with e2 or (if null) k (a key)
6 free should free an entry
7 errfn should do something with an error message
9 skip_new(cmp,free,errfn) -> list
10 skip_insert(list,entry) -> bool
11 skip_delete(list,key) -> bool
12 skip_search(list,key) -> *entry
13 skip_first(list) -> *entry
14 skip_next(*entry) -> *entry
24 #define BitsInRandom 31
26 #define MaxNumberOfLevels 16
27 #define MaxLevel (MaxNumberOfLevels-1)
28 #define newNodeOfLevel(l) (node)malloc(sizeof(struct node)+(l)*sizeof(node))
30 typedef void *keyType;
31 typedef void *valueType;
36 valueType value; /* must be first for skip_next to work */
37 struct node *forward[1]; /* variable sized array of forward pointers */
42 int level; /* Maximum level of the list
43 (1 more than the number of levels in the list) */
44 node header; /* pointer to head of list */
45 int (*cmpfn)(); /* compares two values or a key an a value */
46 void (*freefn)(); /* free a value */
47 void (*errfn)(); /* when malloc error occurs */
50 static void default_errfn(char *msg)
52 write(2, msg, (int)strlen(msg));
57 static int randomsLeft = 0;
58 static int randomBits;
69 errfn = default_errfn;
70 l = (list)malloc(sizeof(struct list));
73 (*errfn)("Malloc failed in skip_new");
77 l->header = newNodeOfLevel(MaxNumberOfLevels);
78 if (l->header == NULL)
80 (*errfn)("Malloc failed in skip_new");
83 for (i=0; i<MaxNumberOfLevels; i++)
84 l->header->forward[i] = NULL;
85 l->header->value = NULL;
91 l->errfn = default_errfn;
95 void skip_free(list l)
103 if (p != l->header) /* header has no meaningful value */
104 (*l->freefn)(p->value);
111 static int randomLevel()
113 register int level = 0;
116 if (randomsLeft == 0) {
118 randomBits = lrand48();
120 randomBits = random();
122 randomsLeft = BitsInRandom/2;
129 return(level>MaxLevel ? MaxLevel : level);
132 boolean skip_insert(list l, valueType value)
135 node update[MaxNumberOfLevels];
140 for (k=l->level ; k>=0 ; k--)
143 while ( p->forward[k] != NULL
144 && (cm=(*l->cmpfn)(p->forward[k]->value, value, 0))<0)
156 update[k] = l->header;
158 q = newNodeOfLevel(k);
161 (*l->errfn)("Malloc failed in skip_insert");
168 q->forward[k] = p->forward[k];
174 boolean skip_delete(list l, keyType key)
177 node update[MaxNumberOfLevels];
183 for (k=l->level ; k>=0 ; k--)
186 while ( p->forward[k] != NULL
187 && (cm=(*l->cmpfn)(p->forward[k]->value, NULL, key))<0)
194 q = update[0]->forward[0];
196 for (k=0; k<=m && (p=update[k])->forward[k] == q ; k++)
197 p->forward[k] = q->forward[k];
199 (*l->freefn)(q->value);
201 while (l->header->forward[m] == NULL && m > 0)
210 valueType *skip_search(list l, keyType key)
217 for (k=l->level ; k>=0 ; k--)
220 while ( p->forward[k] != NULL
221 && (cm=(*l->cmpfn)(p->forward[k]->value, NULL, key))<0)
226 return &p->forward[0]->value;
229 valueType *skip_first(list l)
234 if (p->forward[0] == NULL)
236 return & p->forward[0]->value;
239 valueType *skip_next(valueType *c)
243 if (p->forward[0] == NULL)
245 return & p->forward[0]->value;