Windows2000/private/ntos/rtl/ttri.c

129 lines
3.1 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
--*/
#define DbgPrint DbgPrint
#include <stdio.h>
#include "nt.h"
#include "ntrtl.h"
#include "triangle.h"
ULONG RtlRandom (IN OUT PULONG Seed);
typedef struct _TREE_NODE {
CLONG Data;
TRI_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 TriangleTest()\n");
Root = NULL;
Seed = 0;
for (i=0; i<2048; i++) {
Buffer[i].Data = RtlRandom(&Seed);
Buffer[i].Data = Buffer[i].Data % 512;
TriInitializeSplayLinks(&Buffer[i].Links);
Root = TreeInsert(Root, &Buffer[i]);
}
PrintTree(Root);
DbgPrint("End TriangleTest()\n");
return TRUE;
}
PTREE_NODE TreeInsert (IN PTREE_NODE Root, IN PTREE_NODE Node)
{
PTRI_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 = TriDelete(&Root->Links);
if (Temp == NULL) {
return NULL;
} else {
return CONTAINING_RECORD(Temp, TREE_NODE, Links);
}
}
if (Root->Data < Node->Data) {
// Go right
if (TriRightChild(&Root->Links) == NULL) {
//DbgPrint("Add as right child %u\n", Node->Data);
TriInsertAsRightChild(&Root->Links, &Node->Links);
return CONTAINING_RECORD(TriSplay(&Node->Links), TREE_NODE, Links);
} else {
Root = CONTAINING_RECORD(TriRightChild(&Root->Links), TREE_NODE, Links);
}
} else {
// Go Left
if (TriLeftChild(&Root->Links) == NULL) {
//DbgPrint("Add as left child %u\n", Node->Data);
TriInsertAsLeftChild(&Root->Links, &Node->Links);
return CONTAINING_RECORD(TriSplay(&Node->Links), TREE_NODE, Links);
} else {
Root = CONTAINING_RECORD(TriLeftChild(&Root->Links), TREE_NODE, Links);
}
}
}
}
VOID PrintTree (IN PTREE_NODE Node)
{
PTRI_SPLAY_LINKS Temp;
ULONG LastValue;
if (Node == NULL) {
return;
}
// find smallest value
while (TriLeftChild(&Node->Links) != NULL) {
Node = CONTAINING_RECORD(TriLeftChild(&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 = TriRealSuccessor(&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);
}
}