Вниз
Скачать: CL | DM;

Списки Delphi   Найти похожие ветки 

← →
SkyRanger   (2004-06-06 08:57) [0]

Помогите плиз разобраться. Что то я туплю...
Есть пример показывающий работу со списком:

TValue = String;
PItem=^TItem;
TItem = record
 Data : TValue;
 Next : PItem;
end;

var
 List : PItem;

procedure InsertFirst(var List : PItem; V : TValue);
 var  NewItem : PItem;
 begin
    New(NewItem);              
    NewItem^.Data := V;      
    NewItem^.Next :=List;    
    List := NewItem;          
 end;

procedure PrintList;
var
Item : PItem;
Begin
   Item := List;              
   while Item <> nil do begin  
     Memo1.Lines.Add(Item^.Data);
     Item:=Item^.next;                      
   end; {while}

end;

List:=nil;

InsertFirst(List, "Data1");
InsertFirst(List, "Data2");
InsertFirst(List, "Data3");

Все работает, но в этом примере добавляются элементы в начало списка, а как добавлять их в конец? Что то я туплю и не могу понять, у меня не получается так сделать... :(


← →
Palladin ©   (2004-06-06 09:00) [1]

Пройти до конца списка и назначить поле Next...
Нарисуй на бумажке как строится список и все поймешь...


← →
SkyRanger ©   (2004-06-06 09:03) [2]

Рисовал, никак не въеду, заклинило, можно примерчик плиз???


← →
Palladin ©   (2004-06-06 09:09) [3]

Примерчик чего? Бумаги чтоли?

В памяти сидит толпа записей PItem.



First
 |
-------
Data
Next    --> ---------
-------     Data
           Next      -->  ---------
           ---------      Data
                          Next      --> ...
                          ---------


У тебя в переменной List все время хранится начало списка, тоесть указатель на запись First...

пусть CurElement:=List; тогда соответственно что бы перейти на элемент №(N) тебе нужно N-1 раз выполнить CurElement:=CurElement^.Next;


← →
SkyRanger ©   (2004-06-06 10:53) [4]

Огромное спасибо за разьяснения!
ПОлучилось!
Что то вроде этого:

  New(NewItem);              
  NewItem^.Data := "Data1";  
  NewItem^.Next :=nil;      
  Root:=NewItem;
  CurrItem:=Root;

  Memo1.Lines.Add("Root="+Root^.Data);

  New(NewItem);            
  NewItem^.Data := "Data2";
  NewItem^.Next :=nil;      
  CurrItem^.Next:=NewItem;
  CurrItem:=NewItem;

  Memo1.Lines.Add("Curr="+CurrItem^.Data);

  New(NewItem);            
  NewItem^.Data := "Data3";
  NewItem^.Next :=nil;      
  CurrItem^.Next:=NewItem;
  CurrItem:=NewItem;

  Memo1.Lines.Add("Curr="+CurrItem^.Data);

  CurrItem:=Root;

  while (CurrItem^.Next<>nil) do
  begin
    Memo1.Lines.Add("While="+CurrItem^.Data);
    CurrItem:=CurrItem^.Next;
  end;
  Memo1.Lines.Add("While="+CurrItem^.Data);

   Item := Root;            
   while Item <> nil do begin
     Memo1.Lines.Add(Item^.Data);
     Item:=Item^.next;        
   end; {while}

     while Root<>nil do begin
       Item :=Root;
       Root := Root^.Next;
       Dispose(Item);
     end; {while}



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.019 c
14-1086215474
Jprs154
2004-06-03 02:31
2004.06.20
жаргон школьников


4-1084469493
Vasya.ru
2004-05-13 21:31
2004.06.20
изменение/измерение скорости работы привода?


1-1086406763
mr.Delphin
2004-06-05 07:39
2004.06.20
Сжать или растянуть


6-1082858101
FatBase
2004-04-25 05:55
2004.06.20
Отправка почты: как всё объединить?


14-1086021025
Adminus
2004-05-31 20:30
2004.06.20
Виртуальный сервер.




   Наверх