Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi] Списки


Автор: ruslandlion 21.12.2006, 20:24
Уважаемые программистыю Я уже выучил 8 глав учебника по Delphi и все было хорошо пока не наткнулся на тему списки. Помогите пожалуста разобраться с этой темой. Заранее спасибо.

Автор: Albinos_x 21.12.2006, 21:14
А что непонятно-то с этой темой?

Автор: Sunvas 21.12.2006, 21:44
Цитата(ruslandlion @  21.12.2006,  20:24 Найти цитируемый пост)
Помогите пожалуста разобраться с этой темой. Заранее спасибо.

 smile  smile Сканируешь учебник (или в каком он там виде) и ложишь на форум. Мы тебе поможем найти место опечатки. Бы этого могу только посоветовать что с этой книгой делать дальше...  smile 

Автор: Guedda 21.12.2006, 22:17
Код

type
  A = record
    b : string;
    c : char;
    d : Integer;
  end;

var
  E : A;

begin
  E.b := 'Hello';
  E.c := 'A';
  E.d := 123;

  ShowMessage(E.b);
  Sum := 123 + E.d;
end;


Этим кодом можно показать 80% возможностей списков. Указатели не буду трогать, так как тебе ещё рано их знать smile

Автор: aktuba 22.12.2006, 00:22
Guedda - мне кажется, ты его не понял. Вероятно, он дошел в учебнике до главы о TList.

Вот пример для TList:

Код

var 
  List: tList; 
  Item: pSomeType; 
  I: Integer; 
begin 
{ Создаем список } 
  List := tList.Create; 
{ Пишем данные для списка } 
  for I := 1 to SpinEdit1.Value do 
    begin 
{ Распределяем уникальный экземпляр данных } 
      New(Item); 
      Item^ := I; 
      List.Add(Item); 
    end; 
{ Читаем данные из списка - базовый индекс списка 0, поэтому вычитаем из I единицу } 
  for I := SpinEdit1.Value downto 1 do 
    ListBox1.Items.Add('Элемент ' + 
      IntToStr(pSomeType(List.Items[I - 1])^)); 
{ Освобождаем лист } 
  for I := 1 to SpinEdit1.Value do 
    Dispose(List.Items[I - 1]); 
  List.Free;

Автор: Strell 22.12.2006, 00:24
А вот если надо с указателями:
Код

type    
  A = record    
    b : string;    
    c : char;    
    d : Integer;    
  end;    
PointerToA = ^A;

var P: PointerToA;

begin
  P := GetMemory(sizeof(A));
  P.b := 'sdsd';
  P.c := chr(30);
  P.d := 22;
  ShowMEssage(P.b);
  FreeMemory(P);
end;

smile

Автор: ruslandlion 22.12.2006, 12:58
Вот прекладываемый код к книге[quote]


Код

unit dlist1_; interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit; // фамилия 
Edit2: TEdit; // имя 
Button1: TButton; // кнопка Добавить 
Button2: TButton; // кнопка Показать 
procedure ButtonlClick(Sender: TObject);
procedure Button2Click(Sender: TObject); 
private
{ Private declarations } public
{ Public declarations } 
end;

var
Form1: TForm1;

implementation


{$R *.DFM)


type

TPStudent=^TStudent; // указатель на тип TStudent 


TStudent = record
f_name:string[20]; // фамилия 
l_name: string[20]; // имя 
next: TPStudent; // следующий элемент списка 
end;


var

head: TPStudent; // начало (голова) списка 

// добавить элемент в начало списка 
procedure TForml.Button1Click(Sender: TObject);
var
curr: TPStudent; // новый элемент списка 
begin
new(curr); // выделить память для элемента списка 
curr^.f_name := Edit1.Text;
curr^.1_пате := Edit2.Text;

// добавление в начало списка 
curr^.next := head; head := curr;
// очистить поля ввода 
Edit1.text:=''; Edit2.text: = " ; 
end;

// вывести список 

procedure TForml.Button2Click(Sender: TObject); 
var
curr: TPStudent; // текущий элемент списка 
n:integer; // длина (кол-во элементов) списка 
st:string; // строковое представление списка 
begin 
n := 0; st := '';
curr := head; // указатель на первый элемент списка 

while curr <> NIL do begin
n := n + 1;

st := st + curr^.f_name + ' ' + curr^.1_name +#13; curr := curr^.next; 

// указатель на следующий элемент end;

if n <> 0
then ShowMessage('Список:' + #13 + st)
else ShowMessage('В списке нет элементов.');

end; 

end.



Автор: Beltar 22.12.2006, 13:34
2 Ruslandion:

На форуме есть тег "Код", заключай свой код в него, а то читать без подсветки мучение.

Код

var s:String;


На меня прям ностальгия нахлынула, я когда в инсте в BP 7 разбирался со связными списками впервые умудрился своей прогой подвесить комп. 2 Раза. smile

Просто объявляется указатель на элемент списка.
Объявляется сам элемент и одно поле в нем является указателем на следующий, а можно еще и поле с указателем на предыдущий (двухсвязный список) или даже несколько указателей (тогда получится дерево). Адрес первого элемента запоминается. Из его поля с указателем можно получить адрес второго и т. д. пока указатель следующего не nil.
В такой список можно очень быстро вставлять новые элементы, или удалять существующие, т. к. в отличие от массива не надо заново выделять память и копировать туда весь массив, но поиск в связном медленнее чем в массиве.

Кстати, у меня сейчас на столе тоже лежит учебник по Delphi. В. Фаронов "Создание компонентов Delphi" smile Глава 8 "Создание методов". А 9-я "Создание событий". smile

Автор: Matematik 22.12.2006, 13:34
И что?
 smile 
Цитата(Albinos_x @  21.12.2006,  21:14 Найти цитируемый пост)
А что непонятно-то с этой темой? 


Автор: ruslandlion 22.12.2006, 16:22
Спасибо Beltar что объяснил мне что да как. Я ещё не во всё въехал из этой темы. В учебнике вообще нет никакого определения списков там сразу даётся голый код и понимай как хочешь. Ты не мог бы сказать что нибудь по определению понятия список?

Автор: V.A.KeRneL 30.12.2006, 01:27
http://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%28%D0%B8%D0%BD%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D0%BA%D0%B0%29
http://en.wikipedia.org/wiki/List_%28computing%29

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