![]() |
Хитрое бинарное дерево...
Здравствуйте!
Мне нужно построить двоичное дерево на Си. В узлах дерева хранится ключ - массив из символов (строка) и данные - указатель однонаправленный список. В узлах списка хранится ключ - массив из символов (строка) и данные - указатель на однонаправленный список №2 (ещё один). В узлах списка №2 хранится число и... всё :) На Паскале я такое деревце закодить могу, а на Сях запутался... TT____TT Помогите пожалуйста распутаться. Всего-то деревце, к узлам которого привязаны списки, к узлам которых привязаны списки... Интересуют именно особенности написания кода для такой задачи на Си. |
Код:
void AddToTree(struct tNode *ptr, char[] identName) { Хотя тут, наверно, можно ещё красивее написать, чем пугающие условия вида " if ((cond = strcmp(identName, ptr->name)) == 0) ", подскажите как.. Код:
void TraverseTree(struct tnode *ptr) { |
ManHack, например так
Код:
if ((cond = strcmp(identName, ptr->name)) == 0) -> if (!(cond = strcmp(identName, ptr->name))) |
А когда и где проводить инициализацию списков? Они ведь разные для каждой вершины дерева.
|
Если можно использовать стандартную библиотеку C++:
Код:
#include <string> Код:
map<string, map<string, vector<int> > > my_data; Код:
map<string, map<string, vector<int> > >::iterator found_outer; |
Библиотеки C++ использовать нельзя, даже стандартные. Пишется на чистом Си. Сишные библиотеки подключать можно (например так: #include <stdlib.h>) , но не более того.
Задача такова: На вход программе подаётся входной поток из файлов (пользователь задаёт маску типа *.txt, по которой ищутся файлы в папке с программой с помощью FindFirst и FindNext). В выходной файл он должна записать перечень идентификаторов из файлов входного потока в лексикографическом порядке (понятно, что в процессе чтения файлов создаётся структура [в человеческом смысле слова] хранения идентификаторов и только когда последний файл прочитан до конца эта структура выводится... ). Причём, к каждому идентификатору, записанному в выходной файл дописываются имена файлов, в которых он хранится (без повторений: если 2 одинаковых идент-ра в одном файле, то имя файла выводится единожды) и для каждого файла выводится список строк, в которых встречается данный идентификатор (с повторениями). Под идентификатором понимаете любое слово не длиннее MAX_IDENT_LENGTH (условно, 31 символ) и состоящее из букв и цифр, начинающееся обязательно с буквы и не совпадающее с зарезервированными словами языка (не Си, другого :) ). Если будет предложение получше, чем дерево со списками со списками, то буду очень признателен ^^" Списки - потому, что ограничивать их длину (как делается в случае массива) считается неправомочным. |
Написал так:
TREE.H: Код:
/* ’ҐЄгй*п Ї®§ЁжЁп ў Ёб室*®¬ ⥪б⥠(location.h) */ Код:
#include <stdlib.h> Цитата:
Там вместо нормальных паскалевских птичек употребляются * и &, причёт * могут применяться как к типу, так и к переменной/константе (вроде) и при этом ставиться либо слева от её имени, либо справа (что должно быть немаловажно, а что значит, если * стоит слева? а справа в каких случаях ставится?) Читал Кернигана-Ритчи, не распутался :( Помогите пожалуйста. |
Не понимаю ошибки:
Код:
1>Linking... Код:
... В SCAN.H и TREE.H, естественно, прописано #include.h Как исправить и убрать эти дурацкие ошибки линковки? |
Цитата:
в одном из *.cpp сделай TREE tree=NULL; |
Время: 06:45. |
Время: 06:45.
© OSzone.net 2001-