Вход/Регистрация
Системное программирование в среде Windows
вернуться

Харт Джонсон М.

Шрифт:
Программа 5.2. FillTree и другие функции управления деревом поиска 

LPTNODE FillTree(HANDLE hIn, HANDLE hNode, HANDLE hData)

/* Заполнение дерева записями из входного файла. Используется обработчик исключений вызывающей программы. */

{

 LPTNODE pRoot = NULL, pNode;

 DWORD nRead, i;

 BOOL AtCR;

 TCHAR DataHold [MAX_DATA_LEN] ;

 LPTSTR pString;

 while (TRUE) {

/* Разместить и инициализировать новый узел дерева. */

pNode = HeapAlloc(hNode, HEAP_ZERO_MEMORY, NODE_SIZE);

/* Считать ключ из следующей записи файла. */

if (!ReadFile(hIn, pNode->Key, TKEY_SIZE, &nRead, NULL) || nRead != TKEY_SIZE) return pRoot; 

AtCR = FALSE; /* Считать данные до конца строки. */

for (i = 0; i < MAX_DATA_LEN; i++) {

ReadFile(hIn, &DataHold [i], TSIZE, &nRead, NULL);

if (AtCR && DataHold [i] == LF) break;

AtCR = (DataHold [i] == CR);

}

DataHold[i – 1] = '\0';

/* Объединить ключ и данные — вставить в дерево. */

pString = HeapAlloc(hData, HEAP_ZERO_MEMORY, (SIZE_T)(KEY_SIZE + _tcslen (DataHold) + 1) * TSIZE);

memcpy(pString, pNode->Key, TKEY_SIZE);

pString [KEY_SIZE] = '\0';

_tcscat (pString, DataHold);

pNode->pData = pString;

InsertTree(&pRoot, pNode);

 } /* Конец цикла while (TRUE). */

 return NULL; /* Ошибка */

}

BOOL InsertTree(LPPTNODE ppRoot, LPTNODE pNode)

/* Добавить в дерево одиночный узел, содержащий данные. */

{

 if (*ppRoot == NULL) {

*ppRoot = pNode;

return TRUE;

 }

 /* Обратите внимание на рекурсивные вызовы InsertTree. */

 if (KeyCompare(pNode->Key, (*ppRoot)->Key) < 0) InsertTree(&((*ppRoot)->Left), pNode);

 else InsertTree(&((*ppRoot)->Right), pNode);

}

static int KeyCompare(LPCTSTR pKey1, LPCTSTR pKey2)

/* Сравнить две записи, состоящие из обобщенных символов. */

{

 return _tcsncmp(pKey1, pKey2, KEY_SIZE);

}

static BOOL Scan(LPTNODE pNode)

/* Рекурсивный просмотр и отображение содержимого бинарного дерева. */

{

 if (pNode == NULL) return TRUE;

 Scan(pNode->Left);

 _tprintf(_T ("%s\n"), pNode->pData);

 Scan(pNode->Right);

 return TRUE;

}
 

Примечание

Очевидно, что данную реализацию дерева поиска нельзя назвать самой эффективной, поскольку дереву поиска ничто не мешает стать несбалансированным. Разумеется, о балансировке дерева поиска следовало бы позаботиться, однако на организацию управления памятью в программе это никак не повлияет.

Отображение файлов

Динамическая память, распределенная в кучах, должна физически размещаться в файле подкачки. Управление перемещением страниц между физической памятью и файлом подкачки, а также отображением файла подкачки на виртуальное адресное пространство процесса осуществляется средствами ОС, ответственными за управление памятью. По завершении выполнения процесса физическое пространство в этом файле освобождается.

Те же функциональные возможности Windows, которые обеспечивают отображение файла подкачки, позволяют отображать и обычные файлы. Отображение файлов дает следующие преимущества:

  • Читать дальше
  • 1
  • ...
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: