185 lines
3.3 KiB
C
185 lines
3.3 KiB
C
/*++
|
|
|
|
Copyright (c) 1989 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
tsplay.c
|
|
|
|
Abstract:
|
|
|
|
Test program for the Splay Procedures
|
|
|
|
Author:
|
|
|
|
Gary Kimura [GaryKi] 24-May-1989
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "nt.h"
|
|
#include "ntrtl.h"
|
|
|
|
ULONG RtlRandom ( IN OUT PULONG Seed );
|
|
|
|
typedef struct _TREE_NODE {
|
|
CLONG Data;
|
|
RTL_SPLAY_LINKS Links;
|
|
} TREE_NODE;
|
|
typedef TREE_NODE *PTREE_NODE;
|
|
|
|
TREE_NODE Buffer[2048];
|
|
|
|
PTREE_NODE
|
|
TreeInsert (
|
|
IN PTREE_NODE Root,
|
|
IN PTREE_NODE Node
|
|
);
|
|
|
|
VOID
|
|
PrintTree (
|
|
IN PTREE_NODE Node
|
|
);
|
|
|
|
int
|
|
_CDECL
|
|
main(
|
|
int argc,
|
|
char *argv[]
|
|
)
|
|
{
|
|
PTREE_NODE Root;
|
|
ULONG i;
|
|
ULONG Seed;
|
|
|
|
DbgPrint("Start SplayTest()\n");
|
|
|
|
Root = NULL;
|
|
Seed = 0;
|
|
for (i=0; i<2048; i++) {
|
|
Buffer[i].Data = RtlRandom(&Seed);
|
|
Buffer[i].Data = Buffer[i].Data % 512;
|
|
RtlInitializeSplayLinks(&Buffer[i].Links);
|
|
Root = TreeInsert(Root, &Buffer[i]);
|
|
}
|
|
|
|
PrintTree(Root);
|
|
|
|
DbgPrint("End SplayTest()\n");
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
PTREE_NODE
|
|
TreeInsert (
|
|
IN PTREE_NODE Root,
|
|
IN PTREE_NODE Node
|
|
)
|
|
|
|
{
|
|
PRTL_SPLAY_LINKS Temp;
|
|
|
|
if (Root == NULL) {
|
|
|
|
//DbgPrint("Add as root %u\n", Node->Data);
|
|
return Node;
|
|
|
|
}
|
|
|
|
while (TRUE) {
|
|
|
|
if (Root->Data == Node->Data) {
|
|
|
|
//DbgPrint("Delete %u\n", Node->Data);
|
|
|
|
Temp = RtlDelete(&Root->Links);
|
|
if (Temp == NULL) {
|
|
return NULL;
|
|
} else {
|
|
return CONTAINING_RECORD(Temp, TREE_NODE, Links);
|
|
}
|
|
|
|
}
|
|
|
|
if (Root->Data < Node->Data) {
|
|
|
|
//
|
|
// Go right
|
|
//
|
|
|
|
if (RtlRightChild(&Root->Links) == NULL) {
|
|
|
|
//DbgPrint("Add as right child %u\n", Node->Data);
|
|
RtlInsertAsRightChild(&Root->Links, &Node->Links);
|
|
return CONTAINING_RECORD(RtlSplay(&Node->Links), TREE_NODE, Links);
|
|
|
|
} else {
|
|
|
|
Root = CONTAINING_RECORD(RtlRightChild(&Root->Links), TREE_NODE, Links);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
//
|
|
// Go Left
|
|
//
|
|
|
|
if (RtlLeftChild(&Root->Links) == NULL) {
|
|
|
|
//DbgPrint("Add as left child %u\n", Node->Data);
|
|
RtlInsertAsLeftChild(&Root->Links, &Node->Links);
|
|
return CONTAINING_RECORD(RtlSplay(&Node->Links), TREE_NODE, Links);
|
|
|
|
} else {
|
|
|
|
Root = CONTAINING_RECORD(RtlLeftChild(&Root->Links), TREE_NODE, Links);
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID
|
|
PrintTree (
|
|
IN PTREE_NODE Node
|
|
)
|
|
|
|
{
|
|
PRTL_SPLAY_LINKS Temp;
|
|
ULONG LastValue;
|
|
|
|
if (Node == NULL) {
|
|
return;
|
|
}
|
|
|
|
//
|
|
// find smallest value
|
|
//
|
|
|
|
while (RtlLeftChild(&Node->Links) != NULL) {
|
|
Node = CONTAINING_RECORD(RtlLeftChild(&Node->Links), TREE_NODE, Links);
|
|
}
|
|
LastValue = Node->Data;
|
|
//DbgPrint("%u\n", Node->Data);
|
|
|
|
//
|
|
// while the is a real successor we print the successor value
|
|
//
|
|
|
|
while ((Temp = RtlRealSuccessor(&Node->Links)) != NULL) {
|
|
Node = CONTAINING_RECORD(Temp, TREE_NODE, Links);
|
|
if (LastValue >= Node->Data) {
|
|
DbgPrint("TestSplay Error\n");
|
|
}
|
|
LastValue = Node->Data;
|
|
//DbgPrint("%u\n", Node->Data);
|
|
}
|
|
|
|
}
|