📄 splay.c
字号:
/* * $Id: splay.c,v 1.10 1998/09/23 17:14:23 wessels Exp $ */#include "config.h"#if HAVE_STDIO_H#include <stdio.h>#endif#if HAVE_STDLIB_H#include <stdlib.h>#endif#if HAVE_UNISTD_H#include <unistd.h>#endif#include "splay.h"#include "util.h"int splayLastResult = 0;splayNode *splay_insert(void *data, splayNode * top, SPLAYCMP * compare){ splayNode *new = xcalloc(sizeof(splayNode), 1); new->data = data; if (top == NULL) { new->left = new->right = NULL; return new; } top = splay_splay(data, top, compare); if (splayLastResult < 0) { new->left = top->left; new->right = top; top->left = NULL; return new; } else if (splayLastResult > 0) { new->right = top->right; new->left = top; top->right = NULL; return new; } else { /* duplicate entry */ xfree(new); return top; }}splayNode *splay_splay(const void *data, splayNode * top, SPLAYCMP * compare){ splayNode N; splayNode *l; splayNode *r; splayNode *y; if (top == NULL) return top; N.left = N.right = NULL; l = r = &N; for (;;) { splayLastResult = compare(data, top); if (splayLastResult < 0) { if (top->left == NULL) break; if ((splayLastResult = compare(data, top->left)) < 0) { y = top->left; /* rotate right */ top->left = y->right; y->right = top; top = y; if (top->left == NULL) break; } r->left = top; /* link right */ r = top; top = top->left; } else if (splayLastResult > 0) { if (top->right == NULL) break; if ((splayLastResult = compare(data, top->right)) > 0) { y = top->right; /* rotate left */ top->right = y->left; y->left = top; top = y; if (top->right == NULL) break; } l->right = top; /* link left */ l = top; top = top->right; } else { break; } } l->right = top->left; /* assemble */ r->left = top->right; top->left = N.right; top->right = N.left; return top;}voidsplay_destroy(splayNode * top, SPLAYFREE *free_func){ if (top->left) splay_destroy(top->left, free_func); if (top->right) splay_destroy(top->right, free_func); free_func(top->data); xfree(top);}voidsplay_walk(splayNode *top, SPLAYWALKEE *walkee, void *state){ if (top->left) splay_walk(top->left, walkee, state); if (top->right) splay_walk(top->right, walkee, state); walkee(top->data, state);}#ifdef DRIVERvoidsplay_print(splayNode * top, void (*printfunc) ()){ if (top == NULL) return; splay_print(top->left, printfunc); printfunc(top->data); splay_print(top->right, printfunc);}typedef struct { int i;} intnode;intcompareint(void *a, splayNode * n){ intnode *A = a; intnode *B = n->data; return A->i - B->i;}voidprintint(void *a){ intnode *A = a; printf("%d\n", A->i);}main(int argc, char *argv[]){ int i; intnode *I; splayNode *top = NULL; srandom(time(NULL)); for (i = 0; i < 100; i++) { I = xcalloc(sizeof(intnode), 1); I->i = random(); top = splay_insert(I, top, compareint); } splay_print(top, printint); return 0;}#endif /* DRIVER */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -