Динамические списки vs TList

Модераторы: Duncon, Naeel Maqsudov, Хыиуду, Игорь Акопян

Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

30 апр 2007, 10:52

Naeel Maqsudov а объясни практическое использование оного..
Аватара пользователя
Naeel Maqsudov
Сообщения: 2551
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

30 апр 2007, 11:15

Не уверен что правильно понял вопрос...
Надеюсь, практическое применение динамических структур данных, таких как списки, деревья, динамические массивы не вызывает вопросов. Они нужны :)
Такие структуры данных как связанные списки и деревья содержат элементы, которые помимо данных включают в себя ссылки на другие, себе подобные элементы. Например, в двусвязных списках элемент должен содержать поля Next и Previous, позволяюще найти по указателю соответсттвенно следующий и предыдущий элементы.
В принципе, для этих целей достаточно просто типа Pointer. Но в этом случае правильность разыменования указателя лежит целиком и полностью на разработчике и коммпилятором не проверяется. Например, Item:TItem - это элемент с полями Data:TSomeType и Next:Pointer.
Найти следующий элемент можно так
Item2 := TItem(Item.Next^);
Чтобы указатель .Next был типизированным указателем тип TItem должен быть извесстен до окончательного объявления (определения) самого себя.
Это и есть исключение, которое позволяет описать типизированный указатель до описания базового типа.
Во всех остальных случаях для взаиморекурсивных определений необходимо использовать директиву Forward.
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

30 апр 2007, 14:19

Нет я про вот этот участок кода
type ukaz=^k;
k=record
inf:integer;
next:ukaz; // Меня вот это в недоумение приводит..
end;
Ramzey
Сообщения: 49
Зарегистрирован: 12 дек 2006, 12:56

30 апр 2007, 23:51

Нет я про вот этот участок кода
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.
все это так - для примера.
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

01 май 2007, 10:28

При указании типа компилятор позволяет опускать знак ^ тобишь можно писать
не p1^.next:= а p1.next:=..

Все вехал, спасибки за объяснение (об этом и думал).
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

02 май 2007, 10:14

Duncon писал(а):Ошибка тут(дальше не смотрел)
Ты объявляешь некую переменную ukaz ссылкой на запись и внутри нее переменная next которая будет ссылкой на саму себя, ппс даже объяснить нормально не могу такой бред...

Код: Выделить всё

type ukaz=^k;
        k=record
         inf:integer;
         next:ukaz;
        end;
Это не бред. Это нормальный (если не сказать - классический) спосоп построения списка в Паскале. В институте, когда проходили списки, именно так все и делалось.
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

02 май 2007, 13:41

не ну я все понимаю, но есть такая штука в списках как Next - перейти к следующему элементу..
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

02 май 2007, 13:49

Duncon писал(а):не ну я все понимаю, но есть такая штука в списках как Next - перейти к следующему элементу..
Ну так так и есть: поле элемента (записи) next (указатель) и указывает на следующий элемент списка.
Аватара пользователя
Duncon
Сообщения: 1974
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

02 май 2007, 22:41

BBB писал(а):Ну так так и есть: поле элемента (записи) next (указатель) и указывает на следующий элемент списка.
Ты по это говориш next:ukaz; ?
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

03 май 2007, 10:03

Duncon писал(а):Ты про это говоришь next:ukaz; ?
Ну да.....................
Ответить