Динамические списки vs TList
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
Naeel Maqsudov а объясни практическое использование оного..
- Naeel Maqsudov
- Сообщения: 2570
- Зарегистрирован: 20 фев 2004, 19:17
- Откуда: Moscow, Russia
- Контактная информация:
Не уверен что правильно понял вопрос...
Надеюсь, практическое применение динамических структур данных, таких как списки, деревья, динамические массивы не вызывает вопросов. Они нужны
Такие структуры данных как связанные списки и деревья содержат элементы, которые помимо данных включают в себя ссылки на другие, себе подобные элементы. Например, в двусвязных списках элемент должен содержать поля Next и Previous, позволяюще найти по указателю соответсттвенно следующий и предыдущий элементы.
В принципе, для этих целей достаточно просто типа Pointer. Но в этом случае правильность разыменования указателя лежит целиком и полностью на разработчике и коммпилятором не проверяется. Например, Item:TItem - это элемент с полями Data:TSomeType и Next:Pointer.
Найти следующий элемент можно так
Item2 := TItem(Item.Next^);
Чтобы указатель .Next был типизированным указателем тип TItem должен быть извесстен до окончательного объявления (определения) самого себя.
Это и есть исключение, которое позволяет описать типизированный указатель до описания базового типа.
Во всех остальных случаях для взаиморекурсивных определений необходимо использовать директиву Forward.
Надеюсь, практическое применение динамических структур данных, таких как списки, деревья, динамические массивы не вызывает вопросов. Они нужны

Такие структуры данных как связанные списки и деревья содержат элементы, которые помимо данных включают в себя ссылки на другие, себе подобные элементы. Например, в двусвязных списках элемент должен содержать поля Next и Previous, позволяюще найти по указателю соответсттвенно следующий и предыдущий элементы.
В принципе, для этих целей достаточно просто типа Pointer. Но в этом случае правильность разыменования указателя лежит целиком и полностью на разработчике и коммпилятором не проверяется. Например, Item:TItem - это элемент с полями Data:TSomeType и Next:Pointer.
Найти следующий элемент можно так
Item2 := TItem(Item.Next^);
Чтобы указатель .Next был типизированным указателем тип TItem должен быть извесстен до окончательного объявления (определения) самого себя.
Это и есть исключение, которое позволяет описать типизированный указатель до описания базового типа.
Во всех остальных случаях для взаиморекурсивных определений необходимо использовать директиву Forward.
Нет я про вот этот участок кода
type ukaz=^k;
k=record
inf:integer;
next:ukaz; // Меня вот это в недоумение приводит..
end;
type ukaz=^k;
k=record
inf:integer;
next:ukaz; // Меня вот это в недоумение приводит..
end;
Нет я про вот этот участок кода
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.
все это так - для примера.
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.
все это так - для примера.
При указании типа компилятор позволяет опускать знак ^ тобишь можно писать
не p1^.next:= а p1.next:=..
Все вехал, спасибки за объяснение (об этом и думал).
не p1^.next:= а p1.next:=..
Все вехал, спасибки за объяснение (об этом и думал).
Это не бред. Это нормальный (если не сказать - классический) спосоп построения списка в Паскале. В институте, когда проходили списки, именно так все и делалось.Duncon писал(а):Ошибка тут(дальше не смотрел)
Ты объявляешь некую переменную ukaz ссылкой на запись и внутри нее переменная next которая будет ссылкой на саму себя, ппс даже объяснить нормально не могу такой бред...Код: Выделить всё
type ukaz=^k; k=record inf:integer; next:ukaz; end;
не ну я все понимаю, но есть такая штука в списках как Next - перейти к следующему элементу..
Ну так так и есть: поле элемента (записи) next (указатель) и указывает на следующий элемент списка.Duncon писал(а):не ну я все понимаю, но есть такая штука в списках как Next - перейти к следующему элементу..
Ты по это говориш next:ukaz; ?BBB писал(а):Ну так так и есть: поле элемента (записи) next (указатель) и указывает на следующий элемент списка.
Ну да.....................Duncon писал(а):Ты про это говоришь next:ukaz; ?