Двунаправленный динамический список - Игростроение и развлечение

Форма входа

Приветствую Вас Гость!

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

Наш опрос

Сколько Вам лет ?
Всего ответов: 461


    Случайное фото

    Статистика


Поддержите наш проект

WebMoney:
R309699065243
U292079291240
Z373355457648

Счётчики


Rambler's Top100
Рейтинг@Mail.ru

Двунаправленный динамический список - Игростроение и развлечение

[ Новые сообщения · Участники · Правила форума · RSS ]

WWW Site Forum
Страница 1 из 11
Игростроение и развлечение » Программинг » Языки программирования и конструкторы » Двунаправленный динамический список
Двунаправленный динамический список
KostiaДата: Четверг, 16.04.2009, 18:16 | Сообщение # 1
Программист
Группа: Проверенные
Сообщений: 80
Репутация: 2
Статус: Offline
Смысл двунаправленных динамических списков заключается в том, что каждый элемент списка указывает на предыдущий и следующий.

Умея работать с указателями можно самостоятельно написать свой собственный класс типа TList, заточенный под вашу программу.
Добавление нового элемента происходит очень просто, мы его как бы вклиниваем между двумя другими, как это показано на рисунке.

А удаление элемента из списка элементарно, нужно просто поменять указатель на элемент идущий за другим.

Code
type
    Dat = record
      Data: Pointer;
      Next,Back: Pointer;
end;
    TList = class
     private
       curr,head,pre: ^Dat;
     public
       count: integer;
       procedure Add(item: Pointer);
       procedure Delete(index: DWORD);
       function item(index: DWORD): Pointer;
       constructor Create;
       destructor Deatroy;
end;

implementation

constructor TList.Create;
begin
    count:=0;
    GetMem(head,sizeof(Dat));
end;

destructor TList.Deatroy;
begin
    curr:=head;
    while pre<>nil do
    begin
      pre:=curr;
      dispose(curr);
      curr:=pre^.Next;
    end;
end;

procedure TList.Add(item: Pointer);
begin
    GetMem(curr,sizeof(Dat));
    curr^.Data:=item;
    curr^.Next:=head;
    head^.Back:=curr;
    head:=curr;
    count:=count+1;
end;

procedure TList.Delete(index: DWORD);
var
    i: integer;
begin
    if (index<=0)or(index>count) then exit;
    count:=count-1;
    curr:=head;
    if index=1 then begin head:=head^.Next; head^.Back:=nil; Dispose(curr); exit; end;
    for i:=0 to index-3 do
      curr:=curr^.next;
    if index=count then begin Dispose(curr^.Next); curr^.Next:=nil; end;
    pre:=curr^.Next;
    pre:=pre^.Next;
    curr^.Next:=pre;
    Dispose(pre^.Back);
    pre^.Back:=curr;
end;

function TList.item(index: DWORD): Pointer;
var
    i: integer;
begin
    curr:=head;
    if (index>=0)and(index<count) then
      for i:=0 to count-index-2 do
        curr:=curr^.next
    else exit;
    Result:=curr^.Data;
end;

Пример использования:
Code
{$APPTYPE CONSOLE}
procedure TForm1.FormCreate(Sender: TObject);
var
    i: integer;
    List: TList;
begin
    List:=TList.Create;
    for i:=1 to 9 do
      List.Add(pinteger(i));
    for i:=0 to List.count-1 do
      write(integer(List.item(i)));
    writeln;
    List.Destroy;
end;
Прикрепления: 7671554.png(0Kb) · 8528423.png(0Kb) · 3822658.png(0Kb)
 
quadrathellДата: Воскресенье, 19.04.2009, 14:07 | Сообщение # 2
Admin
Группа: Администраторы
Сообщений: 1018
Репутация: 23
Статус: Offline
Kostia, Можно подробнее, где это можно применить ?

 
KostiaДата: Воскресенье, 19.04.2009, 16:31 | Сообщение # 3
Программист
Группа: Проверенные
Сообщений: 80
Репутация: 2
Статус: Offline
Это тот же массив, только с динамической структурой, т.е. можно просто взять и удаль один из элементов который находится по середине или в начале или вклинить один элемент в середину или в конец.
Например имеется класс врага в котором описаны все необходимые переменные и инструкции(процедуры и функции) и при создание нового врага(например при загрузке уровня) мы его добавляем в список и в нужный момент можем выдернуть его из списка и например нарисовать его на экране или удалить при его смерти.
В Delphi есть стандартный TList, но там он слишком нагроможден и создание собственного списка заточенного под вашу программу повысит эффективность ее выполнения.
 
Игростроение и развлечение » Программинг » Языки программирования и конструкторы » Двунаправленный динамический список
Страница 1 из 11
Поиск: