Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Модуль для работы с динамическими списками (API), динамические структуры данных: списки 
:(
    Опции темы
Alx
Дата 2.3.2009, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



разбираюсь с динамическими структурами, но чувствую без примера даже поллитра не помогут..  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), с остальным разберусь сам..
главное чтоб все это не зависело от глобальных переменных и т.п., то есть чтобы можно было создавать неограниченное кол-во списков этих.

спасибо =)


Это сообщение отредактировал(а) Alx - 2.3.2009, 19:57


--------------------
PM MAIL WWW ICQ   Вверх
kemiisto
Дата 2.3.2009, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: нет
Всего: 160



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

Добавлено через 3 минуты и 41 секунду
Ну, а что гугл, уже не помошник?
Не то?


--------------------
PM MAIL WWW GTalk Jabber   Вверх
Alx
Дата 2.3.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



Цитата

Страниц:  352

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

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


--------------------
PM MAIL WWW ICQ   Вверх
Alx
Дата 2.3.2009, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



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

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


--------------------
PM MAIL WWW ICQ   Вверх
Alx
Дата 2.3.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ajaxy
****


Профиль
Группа: Комодератор
Сообщений: 2903
Регистрация: 26.11.2003
Где: Cutopia

Репутация: нет
Всего: 78



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



Это сообщение отредактировал(а) Alx - 17.4.2009, 00:25


--------------------
PM MAIL WWW ICQ   Вверх
Google
  Дата 19.1.2019, 08:59 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0703 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.