IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Преобразование списка в дерево
biba
сообщение 7.08.2004 17:05
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 19
Пол: Женский

Репутация: -  0  +


AAAAAAA Почему закрыли мою тему!? angry.gif <_<
Вопрос в том, что нужно создать дерево из СПИСКА, а не из файла ( из файла- это уже другой пункт моей курсовой и я не думаю, что два разных задания решаются одной программой huh.gif ).
Написано сумбурно, но как могу так и пишу, по другому это я объяснить не могу. sad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
BlackShadow
сообщение 10.08.2004 13:57
Сообщение #2


Гость






Цитата
Часть вторая - создание дерева (двоичного наверно, хотя написано в задании бинарного)

Это одно и то же. А по-англицки это звучиь как Full Shit smile.gif

Ближе к теме. Двоичное дерево выглядит так: есть корень. У корня может быть до двух ветвей. У каждой ветви может быть до двух "подветвей" и т. д. Чем оно удобно? Например тем, что можно задавать путь к элементу серией указаний типа "налво, налево, налево (это уже измена выйдет) направо, направо, налево (иногда же можно), направо" smile.gif. В соответствие этим командам можно поставить 0 или 1. Таким образом описанное выше можно записать как 1110010, что соответствует 114 в деятичной. Теперь смотри: берём список (сотворенный ранее), перебираем все его элементы, ключ расцениваем ка маршрут, а элемент как элемент smile.gif. Таким вот образом и составляем дерево. Так же надо учесть, что тут мы пользуемся очаровательным моментом: чичло 1110010 - это число 1110010. Его можно записать только так. Если что-то записано не так, то это уже не число 1110010 smile.gif

От теории к практике:

Код

Type
 {Элемент дерева}
 PTreeItem=^TTreeItem;
 TTreeItem=Record
   Item:String;          {Значение}
   Left:PTreeItem;     {Левая ветвь}
   Right:PTreeItem    {Правая ветвь}
 End;

{Ещё одна тупость для преподов}
Function Tree_Create:PTreeItem;
Begin
 Tree_Create:=Nil
End;

{Освобождение памяти}
Procedure Tree_Free(Var Tree:PTreeItem);
Begin
 If Tree=Nil Then
   Exit;
 Tree_Free(Tree^.Left);
 Tree_Free(Tree^.Right);
 Dispose(Tree);
 Tree:=Nil
End;

{Добавление элемента}
Procedure Tree_Set(Var Tree:PTreeItem;Key:String;Item:String);
Begin
 If (Tree=Nil) Then
 Begin
   New(Tree);
   Tree^.Left:=Nil;
   Tree^.Right:=Nil;
   Tree^.Item:=''
 End;
 If (Key="")
   Tree^.Item:=Item
 Else
   If Key[1]="1" Then
     Tree_Set(Tree^.Left,Copy(Key,2,255),Item)
   Else
     Tree_Set(Tree^.Right,Copy(Key,2,255),Item)
End;

{Для удобства может понадобиться ф-ция перевода числа в строку}
Function IntToStr(n:Integer):String;
Var
 Result:String;
Begin
 Str(n,s);
 IntToStr:=Result
End;

{А процедура перевода списка в дерево будет выглядеть примерно так...}
Function Convert(List:PListRec):PTreeItem;
Var
 Result:PTreeItem;
 p:PListRec;
Begin
 Result:=Tree_Create;
 p:=List;
 While p<>Nil Do
   Tree_Set(Result,IntToStr(p^.Key),p^.Item);
 Convert:=Result
End;


Ну, напоминать про ошибочки не буду smile.gif

При работе с файлом можно сделать что-то типа такого:
Код

Var
 n:Integer;
 f:Text;
 s:String;
 Tree:PTreeItem;
Begin
 Assign(f,"Input.Txt");
 Reset(f);
 n:=1;
 Tree:=Tree_Create;
 While Not Eof(f) Do
 Begin
   ReadLn(f,s);
   Tree_Set(Tree,IntToStr(n),s);
   Inc(n)
 End;
 Close(f)
End.


При работе с юзьверем можно сделать так:
Код

Var
 n:Integer;
 s:String;
 Tree:PTreeItem;
Begin
 n:=1;
 Tree:=Tree_Create;
 While Not Eof(f) Do
 Begin
   ReadLn(s);
   If s="end" Then
     Break;
   Tree_Set(Tree,IntToStr(n),s);
   Inc(n)
 End
End.

будет считывать, пока юзверь не введёт "end".

А про рамку я понял теперь окончательно. Выводит у тебя не так, как я написал, а поочерёдно. Но лечение прежнее smile.gif
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 21.06.2025 20:10
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"