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

> Прочтите прежде чем задавать вопрос!

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

 
 Ответить  Открыть новую тему 
> Граф и ссылки, Как задать граф с помощью динамич. структур данных.
looogle
сообщение 16.03.2012 22:29
Сообщение #1


Новичок
*

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

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


Есть такой код. Универсальный способ обхода древовидного графа. С ним я разобрался. А вот как задать граф я не понимаю.

Граф:

Изображение


type ukazatel = ^tree;
tree = record
data:integer;
left:ukazatel;
right:ukazatel;
end;

var p, root:ukazatel;
k, i:integer;

procedure treego(p: ukazatel; k:integer);
begin
P^.data := k;
if p^.left<>nil then treego(p^.left, k+1);
if p^.right<>nil then treego(p^.right, k+1);
write('Done!');
end;

begin
new(root);
treego(root, 1);
end.



Пожалуйста, помогите. blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Krjuger
сообщение 17.03.2012 13:36
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

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


Щас ты строишь полное дерево,где у каждого предка существует всегда 2 потомка.Как вариант, начинаешь дополнять условия
if p^.left<>nil
например
if p^.left<>nil and p^.data<> 5 then ......
тогда у 5 круга не будет создан левый потомок.... Я точно не могу сказать, но так вроде занумеровать нельзя,так что либо вводить еще одно поле отображающее дату,а k использовать как номер в дереве, либо менять само заполнение сделав функцию, преобразующую к к нужному значению.

Или это был лишь пример того,как ты думаешь, как должно формироваться дерево?

Сообщение отредактировано: Krjuger - 17.03.2012 14:00
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 17.03.2012 18:56
Сообщение #3


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

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


Цитата
А вот как задать граф я не понимаю.
Больше похоже на дерево, а не на граф.

Я в таких случаях пользуюсь приемом, подсмотренным в TurboVision в свое время (у них подобным образом организуются меню любой вложенности - одним вызовом):
type ukazatel = ^tree;
tree = record
data:integer;
left:ukazatel;
right:ukazatel;
end;

procedure walk(p: ukazatel; level:integer);
begin
writeln('':2*level, p^.data);
if p^.left<>nil then walk(p^.left, level+1);
if p^.right<>nil then walk(p^.right, level+1);
end;

function it(value : integer; L, R : ukazatel) : ukazatel;
var p : ukazatel;
begin
new(p);
with p^ do
begin
data := value;
left := L;
right := R;
end;
it := p;
end;

var
root : ukazatel;

begin
root := it(2,
it(7,
it(2, nil, nil),
it(6,
it(5, nil, nil),
it(11, nil, nil)
)
),
it(5,
nil,
it(9,
it(4, nil, nil),
nil
)
)
);

walk(root, 0); { <--- Выводим, что получилось}
{ Не забудь удалить структуру }
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
looogle
сообщение 19.03.2012 20:43
Сообщение #4


Новичок
*

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

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


Цитата(Krjuger @ 17.03.2012 14:36) *

Щас ты строишь полное дерево,где у каждого предка существует всегда 2 потомка.Как вариант, начинаешь дополнять условия
if p^.left<>nil
например
if p^.left<>nil and p^.data<> 5 then ......
тогда у 5 круга не будет создан левый потомок.... Я точно не могу сказать, но так вроде занумеровать нельзя,так что либо вводить еще одно поле отображающее дату,а k использовать как номер в дереве, либо менять само заполнение сделав функцию, преобразующую к к нужному значению.

Или это был лишь пример того,как ты думаешь, как должно формироваться дерево?


Изначально граф не задан, поэтому обходить он его не будет. Там стоит условие
if p^.left<>nil

чтобы ходить по графу, а
P^.data := k;

просто как пример.
Мне надо было узнать, как именно задавать граф. Иначе алгоритм просто не будет работать.


Добавлено через 2 мин.
Цитата(IUnknown @ 17.03.2012 19:56) *

Больше похоже на дерево, а не на граф.

Я в таких случаях пользуюсь приемом, подсмотренным в TurboVision в свое время (у них подобным образом организуются меню любой вложенности - одним вызовом):
type ukazatel = ^tree;
tree = record
data:integer;
left:ukazatel;
right:ukazatel;
end;

procedure walk(p: ukazatel; level:integer);
begin
writeln('':2*level, p^.data);
if p^.left<>nil then walk(p^.left, level+1);
if p^.right<>nil then walk(p^.right, level+1);
end;

function it(value : integer; L, R : ukazatel) : ukazatel;
var p : ukazatel;
begin
new(p);
with p^ do
begin
data := value;
left := L;
right := R;
end;
it := p;
end;

var
root : ukazatel;

begin
root := it(2,
it(7,
it(2, nil, nil),
it(6,
it(5, nil, nil),
it(11, nil, nil)
)
),
it(5,
nil,
it(9,
it(4, nil, nil),
nil
)
)
);

walk(root, 0); { <--- Выводим, что получилось}
{ Не забудь удалить структуру }
end.



Да, именно то, что надо! Спасибо.
А в root записывается голова или хвост?

Сообщение отредактировано: looogle - 19.03.2012 20:47
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 19.03.2012 21:24
Сообщение #5


a.k.a. volvo877
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской

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


У дерева не очень принято называть этот элемент "голова" или "хвост". Обычно у деревьев бывает "корень", из которого все и растёт. Вот тут как раз и есть Root (в переводе - корень)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
looogle
сообщение 19.03.2012 21:37
Сообщение #6


Новичок
*

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

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


Цитата(IUnknown @ 19.03.2012 22:24) *

У дерева не очень принято называть этот элемент "голова" или "хвост". Обычно у деревьев бывает "корень", из которого все и растёт. Вот тут как раз и есть Root (в переводе - корень)


Да-да. Это я и имел ввиду. Спасибо.
Вот конечный код, если интересно.

P.S. Что значит удалить структуру? blush.gif


uses GraphABC;

type
ukazatel = ^tree;
tree = record
x: integer;
y: integer;
left: ukazatel;
right: ukazatel;
data:integer;
end;

procedure walk(p: ukazatel; x,y,level,xp,yp: integer);
var s:string;
begin
if p^.left <> nil then walk(p^.left, x-(150 div level), y+30, level+1, x, y);
if p^.right <> nil then walk(p^.right, x+(150 div level), y+30, level+1, x, y);
MoveTo(x,y);
LineTo(xp,yp);
s:=IntToStr(p^.data);
p^.x := x;
p^.y := y;
Circle(x,y,13);
TextOut(x-5,y-5,s);
end;

function it(datav:integer; L, R: ukazatel): ukazatel;
var
p: ukazatel;
begin
new(p);
with p^ do
begin
left := L;
right := R;
data := datav;
end;
it := p;
end;

var
root: ukazatel;

begin
root := it(2,
it(7,
it(2, nil, nil),
it(6,
it(5, nil, nil),
it(11, nil, nil)
)
),
it(5,
nil,
it(9,
it(4, it(22, it(55, nil, nil), nil), nil),
nil
)
)
);

walk(root, 250, 250, 1, 250, 250);
end.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 20.03.2012 9:30
Сообщение #7


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

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


Удалсть структуру - это значит удалить память, занимаемую её, то есть сделать Dispose для всех узлов-указателей, составляющих её.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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