00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #define DbgPrint DbgPrint
00022
00023
#include <stdio.h>
00024
00025
#include "nt.h"
00026
#include "ntrtl.h"
00027
#include "triangle.h"
00028
00029 ULONG
RtlRandom (IN OUT PULONG Seed);
00030
00031
typedef struct _TREE_NODE {
00032 CLONG
Data;
00033 TRI_SPLAY_LINKS Links;
00034 }
TREE_NODE;
00035 typedef TREE_NODE *
PTREE_NODE;
00036
00037 TREE_NODE Buffer[2048];
00038
00039
PTREE_NODE
00040
TreeInsert (
00041 IN PTREE_NODE Root,
00042 IN PTREE_NODE Node
00043 );
00044
00045
VOID
00046
PrintTree (
00047 IN PTREE_NODE Node
00048 );
00049
00050
int
00051 _CDECL
00052 main(
00053
int argc,
00054
char *argv[]
00055 )
00056 {
00057
PTREE_NODE Root;
00058 ULONG i;
00059 ULONG
Seed;
00060
00061
DbgPrint(
"Start TriangleTest()\n");
00062
00063 Root =
NULL;
00064
Seed = 0;
00065
for (i=0; i<2048; i++) {
00066
Buffer[i].Data =
RtlRandom(&
Seed);
00067
Buffer[i].Data =
Buffer[i].Data % 512;
00068
TriInitializeSplayLinks(&
Buffer[i].Links);
00069 Root =
TreeInsert(Root, &
Buffer[i]);
00070 }
00071
00072
PrintTree(Root);
00073
00074
DbgPrint(
"End TriangleTest()\n");
00075
00076
return TRUE;
00077
00078 }
00079
00080
PTREE_NODE
00081
TreeInsert (
00082 IN PTREE_NODE Root,
00083 IN PTREE_NODE Node
00084 )
00085
00086 {
00087
PTRI_SPLAY_LINKS Temp;
00088
00089
if (Root ==
NULL) {
00090
00091
00092
return Node;
00093
00094 }
00095
00096
while (
TRUE) {
00097
00098
if (Root->Data == Node->Data) {
00099
00100
00101
00102 Temp =
TriDelete(&Root->Links);
00103
if (Temp ==
NULL) {
00104
return NULL;
00105 }
else {
00106
return CONTAINING_RECORD(Temp,
TREE_NODE, Links);
00107 }
00108
00109 }
00110
00111
if (Root->Data < Node->Data) {
00112
00113
00114
00115
00116
00117
if (
TriRightChild(&Root->Links) ==
NULL) {
00118
00119
00120
TriInsertAsRightChild(&Root->Links, &Node->Links);
00121
return CONTAINING_RECORD(
TriSplay(&Node->Links),
TREE_NODE, Links);
00122
00123 }
else {
00124
00125 Root = CONTAINING_RECORD(
TriRightChild(&Root->Links),
TREE_NODE, Links);
00126
00127 }
00128
00129 }
else {
00130
00131
00132
00133
00134
00135
if (
TriLeftChild(&Root->Links) ==
NULL) {
00136
00137
00138
TriInsertAsLeftChild(&Root->Links, &Node->Links);
00139
return CONTAINING_RECORD(
TriSplay(&Node->Links),
TREE_NODE, Links);
00140
00141 }
else {
00142
00143 Root = CONTAINING_RECORD(
TriLeftChild(&Root->Links),
TREE_NODE, Links);
00144
00145 }
00146
00147 }
00148 }
00149 }
00150
00151
VOID
00152
PrintTree (
00153 IN PTREE_NODE Node
00154 )
00155
00156 {
00157
PTRI_SPLAY_LINKS Temp;
00158 ULONG LastValue;
00159
00160
if (Node ==
NULL) {
00161
return;
00162 }
00163
00164
00165
00166
00167
00168
while (
TriLeftChild(&Node->Links) !=
NULL) {
00169 Node = CONTAINING_RECORD(
TriLeftChild(&Node->Links),
TREE_NODE, Links);
00170 }
00171 LastValue = Node->Data;
00172
00173
00174
00175
00176
00177
00178
while ((Temp =
TriRealSuccessor(&Node->Links)) !=
NULL) {
00179 Node = CONTAINING_RECORD(Temp,
TREE_NODE, Links);
00180
if (LastValue >= Node->Data) {
00181
DbgPrint(
"TestSplay Error\n");
00182 }
00183 LastValue = Node->Data;
00184
00185 }
00186
00187 }