Страница 1 из 2
Re: динамические структуры в паскале
Добавлено: 30 апр 2007, 10:52
Duncon
Naeel Maqsudov а объясни практическое использование оного..
Re: динамические структуры в паскале
Добавлено: 30 апр 2007, 11:15
Naeel Maqsudov
Не уверен что правильно понял вопрос...
Надеюсь, практическое применение динамических структур данных, таких как списки, деревья, динамические массивы не вызывает вопросов. Они нужны

Такие структуры данных как связанные списки и деревья содержат элементы, которые помимо данных включают в себя ссылки на другие, себе подобные элементы. Например, в двусвязных списках элемент должен содержать поля Next и Previous, позволяюще найти по указателю соответсттвенно следующий и предыдущий элементы.
В принципе, для этих целей достаточно просто типа Pointer. Но в этом случае правильность разыменования указателя лежит целиком и полностью на разработчике и коммпилятором не проверяется. Например, Item:TItem - это элемент с полями Data:TSomeType и Next:Pointer.
Найти следующий элемент можно так
Item2 := TItem(Item.Next^);
Чтобы указатель .Next был
типизированным указателем тип TItem должен быть извесстен до окончательного объявления (определения) самого себя.
Это и есть исключение, которое позволяет описать типизированный указатель до описания базового типа.
Во всех остальных случаях для взаиморекурсивных определений необходимо использовать директиву Forward.
Re: динамические структуры в паскале
Добавлено: 30 апр 2007, 14:19
Duncon
Нет я про вот этот участок кода
type ukaz=^k;
k=record
inf:integer;
next:ukaz; // Меня вот это в недоумение приводит..
end;
Re: динамические структуры в паскале
Добавлено: 30 апр 2007, 23:51
Ramzey
Нет я про вот этот участок кода
type ukaz=^k;
k=record
inf:integer;
next:ukaz; // Меня вот это в недоумение приводит..
end;
Это "недоумение" означает, что поле NEXT переменной типа 'k' будет указателем на другую переменную этого типа. Т.е. (согласно вышеобъявленному):
var
p1 : ukaz;
begin
...
new(p1); {создали р1}
p1^.inf:=info1 {запомнили данные}
new(p1^.next); {создаем новую переменнум (элемент списка)}
p1:=p1^.next; {передвигаем указатель списка на вновь созданную переменную}
...
p1^.inf:=info2 {запомнили нужные данные}
...
p1^.next:=nil {так надо

}
...
end.
все это так - для примера.
Re: динамические структуры в паскале
Добавлено: 01 май 2007, 10:28
Duncon
При указании типа компилятор позволяет опускать знак ^ тобишь можно писать
не p1^.next:= а p1.next:=..
Все вехал, спасибки за объяснение (об этом и думал).
Добавлено: 02 май 2007, 10:14
BBB
Duncon писал(а):Ошибка тут(дальше не смотрел)
Ты объявляешь некую переменную ukaz ссылкой на запись и внутри нее переменная next которая будет ссылкой на саму себя, ппс даже объяснить нормально не могу такой бред...
Код: Выделить всё
type ukaz=^k;
k=record
inf:integer;
next:ukaz;
end;
Это
не бред. Это нормальный (если не сказать - классический) спосоп построения списка в Паскале. В институте, когда проходили списки, именно так все и делалось.
Re: динамические структуры в паскале
Добавлено: 02 май 2007, 13:41
Duncon
не ну я все понимаю, но есть такая штука в списках как Next - перейти к следующему элементу..
Добавлено: 02 май 2007, 13:49
BBB
Duncon писал(а):не ну я все понимаю, но есть такая штука в списках как Next - перейти к следующему элементу..
Ну так так и есть: поле элемента (записи) next (указатель) и указывает на следующий элемент списка.
Re: динамические структуры в паскале
Добавлено: 02 май 2007, 22:41
Duncon
BBB писал(а):Ну так так и есть: поле элемента (записи) next (указатель) и указывает на следующий элемент списка.
Ты по это говориш next:ukaz; ?
Re: динамические структуры в паскале
Добавлено: 03 май 2007, 10:03
BBB
Duncon писал(а):Ты про это говоришь next:ukaz; ?
Ну да.....................