в итоге все таки разобрался и накатал api. по мере появления добавлю новые процедуры/функции. не знаю, что там и как с уборкой мусора, если кто знает, подскажите.
http://ajaxy.ru/download/MAI/ПнЯВУ/Динамические_списки:_API_(модуль)/
| Код | { *** JamList *** dynamic lists api library written by Alexander Zinchuk (Ajaxy) E-mail: [email protected] * 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: -)
|
|