Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Модуль для работы с динамическими списками (API)

Поиск:
Динамические структуры данных: списки. API.

скачать.

Код

{
    *** JamList ***
    
    dynamic lists api library
    
    written by Alexander Zinchuk (Ajaxy)
    E-mail: hey@ajaxy.ru
    
    * item - node of the list
    * element - item's 'data' field
}

unit JamList;



interface


const
  JLIST_NULL = '%null%';

type
  jlistDT = string;
  jlist = ^_jlist;
  _jlist = record
    data:jlistDT;
    next:jlist;
  end;
  
procedure jlist_new(var first:jlist);                                    { creates new list }
procedure jlist_push(var first:jlist; value:jlistDT);                    { adds element in the end of list }
procedure jlist_insert(var first:jlist; index:integer; value:jlistDT);   { inserts element in the list}
procedure jlist_set(first:jlist; index:integer; value:jlistDT);          { sets value of an element }
procedure jlist_print(first:jlist);                                      { prints list dump to screen }
procedure jlist_print_file(first:jlist; var f:text);                     { prints list dump in file }
procedure jlist_kill(first:jlist);                                       { removes list from memory }
function jlist_get(first:jlist; index:integer):jlistDT;                  { returns element by index }
function jlist_length(first:jlist):integer;                              { counts list's elements }
function jlist_getItem(first:jlist; index:integer):jlist;                { returns item by index }
function jlist_getLastItem(first:jlist):jlist;                           { returns the last item }


  
implementation

  
procedure jlist_new(var first:jlist);
begin
  new(first);
  first^.data := '%first%';
  first^.next := NIL;
end;


procedure jlist_push(var first:jlist; value:jlistDT);
var
  item:jlist;
  last:jlist;
begin
  new(item);
  item^.next := NIL;
  item^.data := value;
  last := jlist_getLastItem(first);
  if last <> NIL then
    last^.next := item
  else
    first^.next := item;
end;


procedure jlist_insert(var first:jlist; index:integer; value:jlistDT);
var
  item:jlist;
  after:jlist;
  before:jlist;
begin
  new(item);
  after := jlist_getItem(first, index-1);
  if(after = NIL) then
  begin
    jlist_push(first, value);
    exit;
  end;
  item^.next := after^.next;
  item^.data := value;
  after^.next := item;
end;


procedure jlist_set(first:jlist; index:integer; value:jlistDT);
var
  item:jlist;
begin
  item := jlist_getItem(first, index);
  if item <> NIL then
    item^.data := value;
end;


procedure jlist_print(first:jlist);
var
  current:jlist;
  i:integer;
begin
  new(current);
  current := first^.next;
  i := 0;
  while current <> NIL do
  begin
    writeln(i,': ',current^.data);
    current := current^.next;
    inc(i);
  end;
end;


procedure jlist_print_file(first:jlist; var f:text);
var
  current:jlist;
  i:integer;
begin
  new(current);
  current := first^.next;
  i := 0;
  while current <> NIL do
  begin
    writeln(f, i,': ',current^.data);
    current := current^.next;
    inc(i);
  end;
end;


procedure jlist_kill(first:jlist);
var
  current:jlist;
  previous:jlist;
  i:integer;
begin
  new(current);
  new(previous);
  current := first^.next;
  i := 0;
  while current <> NIL do
  begin
    previous^ := current^;
    current := current^.next;
    dispose(previous);
    inc(i);
  end;
  dispose(current);
  dispose(first);
end;


function jlist_get(first:jlist; index:integer):jlistDT;
var
  item:jlist;
begin
  item := jlist_getItem(first, index);
  if item <> NIL then
    jlist_get := item^.data
  else
    jlist_get := JLIST_NULL;
end;


function jlist_length(first:jlist):integer;
var
  current:jlist;
  i:integer;
begin
  new(current);
  current := first^.next;
  i := 0;
  while current <> NIL do
  begin
    current := current^.next;
    inc(i);
  end;
  jlist_length := i;
end;


function jlist_getItem(first:jlist; index:integer):jlist;
var
  current:jlist;
  i:integer;
begin
  new(current);
  i := 0;
  current := first^.next;
  while (i < index) and (current^.next <> NIL) do
  begin
    current := current^.next;
    inc(i);
  end;
  if (i = index) then
    jlist_getItem := current
  else
    jlist_getItem := NIL;
end;


function jlist_getLastItem(first:jlist):jlist;
var
  current:jlist;
begin
  new(current);
  current := first^.next;
  if current <> NIL then
  begin
    while current^.next <> NIL do
    begin
      current := current^.next;
    end;
  end;
  jlist_getLastItem := current;
end;


end.


работает так:
Код

program JamListTest;

uses
  crt, dos, JamList;

var
  A:jlist;

begin
  clrscr;
  jlist_new(A); { создаёт новый список }
  jlist_push(A, 'hello'); { добавляет новый элемент в конец списка }
  jlist_push(A, 'world'); { добавляет ещё элемент в конец списка }
  jlist_push(A, '-)'); { ---||--- }
  jlist_print(A); { распечатывает список с нумерацией }
  writeln;
  writeln(jlist_get(A, 1)); { распечатывает вывод элемента с индексом "1" }
  writeln;
  jlist_insert(A, 1, 'my'); { вставляет элемент в позицию с индексом "1", сдвигая следующие элементы }
  jlist_set(A, 2, 'love'); { устанавливает элемент с индеком "2" (бывш. "world") }
  jlist_print(A); { распечатывает список с нумерацией }
  readkey;
end.


вернет
Цитата


0: hello

1: world

2: -)





world





0: hello

1: my

2: love

3: -)







Просмотров: 4037

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную