Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Модуль для работы с динамическими списками (API)


Автор: Alx 2.3.2009, 00:20
разбираюсь с динамическими структурами, но чувствую без примера даже поллитра не помогут..  smile 
везде какие-то примеры то с глобальными переменными, то с извращенными действиями..

хотелось бы почитать код нормальных функций для абстрактной работы с этими самыми списками..

нашел было, то что нужно, но автор олень за исходники 50 рублей хочет =)

Цитата

type TData=string;
     TList=^TLink;
     TLink=record
         Data: TData;
         Next: TList;
     end;

{ Создание пустого списка }
procedure Create(var First: TList);

{ добавление элемента в начало списка }
procedure AddFirst (var First: TList; x: TData);
{ добавление элемента в конец списка }
procedure Add (var First: TList; x: TData);
{ вставка элемента в список }
procedure Insert (var First: TList; Index: integer; x: TData);

{ удаление элемента из начала списка }
procedure DelFirst (var First: TList);
{ удаление элемента из конца списка }
procedure DelLast (var First: TList);
{ удаление элемента списка с заданным номером }
procedure Del (var First: TList; Index: integer);

{ печать списка }
procedure Print(First:TList);
{ сортировка списка }
procedure Sort (var First: TList);
{ удаление списка }
procedure Clear (var First: TList);


мне из этого хотя бы основное - Create и Add (и что-то типа Get/Find), с остальным разберусь сам..
главное чтоб все это не зависело от глобальных переменных и т.п., то есть чтобы можно было создавать неограниченное кол-во списков этих.

спасибо =)

Автор: kemiisto 2.3.2009, 00:36
Alx, если уж PASCAL, то может Вирт Н. - Алгоритмы и структуры данных?

Добавлено через 3 минуты и 41 секунду
Ну, а что гугл, уже не помошник?
http://snippets.dzone.com/posts/show/3253

Автор: Alx 2.3.2009, 00:41
Цитата

Страниц:  352

как-то в мои планы не очень входит =)

а что исх. код 3 функций попалить негде?  smile 

Автор: Alx 2.3.2009, 02:02
Цитата(kemiisto @  2.3.2009,  00:36 Найти цитируемый пост)
Ну, а что гугл, уже не помошник?
Не то? 

да, вроде бы то, спасибо smile

Автор: Alx 2.3.2009, 19:45
в итоге все таки разобрался и накатал 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: -)


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)