Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Односвязный список,почему у меня не связывает? :) [D7, WinXP]


John Doe ©   (2005-10-28 23:10:00) 

var
  frmLink: TfrmLink;
 Aux,Help: PSimpleNode;

implementation

{$R *.dfm}

procedure TfrmLink.FormCreate(Sender: TObject);
begin
 Aux:=nil;
end;

procedure TfrmLink.btnTestClick(Sender: TObject);
var NewOne: PSimpleNode;
begin
 New(NewOne);
 NewOne^.Data:=Edit1.Text;
 NewOne^.Next:=Aux;
 Aux:=NewOne;

 while Aux<>nil do
   begin
     ShowMessage(Aux^.Data);
     Aux:=Aux^.Next;
   end;

end;

end.

Почему он выдает мне только 1 строку в ShowMessage(Aux^.Data),а не весь список?
Получается,что Aux=nil,после первого прохода...
Но почему?


John Doe   (2005-10-29 21:21:00) [1]


> Все базовые алгоритмы  знать нужно, алгоритмы и анализ их
> работы рекомендую прочитать в "Фундаментальные алгоритмы
> и типы данных в DELPHI" там и списки и очереди.

Хе...
А я думаешь это откуда взял?
Просто чуть модифицировал пример.
Чуть усложнил.


tesseract   (2005-10-29 21:05:00) [2]


> Может и так.
> Но к сожалению работа с ними как я вижу "и опасна,и трудна"
> :)


Все базовые алгоритмы  знать нужно, алгоритмы и анализ их работы рекомендую прочитать в "Фундаментальные алгоритмы и типы данных в DELPHI" там и списки и очереди.

> Так же связанные списки хороши, когда требуется последовательная
> обработка элементов, "перескоки" осуществляются медленно.
>


Списки хороши кода нужно хранить МНОГО плохо структурированной либо разнотипной информации. Они гибче но медленнее. Как правило создаётся доп массив с ссылками на элементы списка.


John Doe   (2005-10-29 19:52:00) [3]


> Так же связанные списки хороши, когда требуется последовательная
> обработка элементов
>

Может и так.
Но к сожалению работа с ними как я вижу "и опасна,и трудна" :)


Zeqfreed   (2005-10-29 19:32:00) [4]

John Doe ©   (29.10.05 18:50) [6]
Использовать связанные списки стоит тогда, когда идет интенсивное создание/удаление/перемещение элементов, только стоит использовать некие дополнительные "ухищрения" с выделением памяти (т.е. не выделять память при каждом добавлении элемента). Так же связанные списки хороши, когда требуется последовательная обработка элементов, "перескоки" осуществляются медленно.


Anatoly Podgoretsky   (2005-10-29 18:59:00) [5]

John Doe ©   (29.10.05 18:50) [6]
Бережным распределением памяти и не пахнет.


John Doe   (2005-10-29 18:50:00) [6]

А вообще мастера,скажите мне...
Часто ли вы применяте связные списки.
И в каких случаях он нужен,ну кроме того,чтоб бережно распределять память.


John Doe   (2005-10-29 13:11:00) [7]

to Siknik
Да,да я теперь понял.
Ты правильно заметил.

Получалось что я доводил Aux до nil.
А потом при новом обращении к процедуре,NewOne^Next ссылался не на педыдущий элемент списка,а на nil.
Потому прога и выдавала мне только 1 строку.
Нда...
Идиотизм. :)


Zeqfreed   (2005-10-29 13:04:00) [8]

Defunct ©   (29.10.05 2:02) [2]

Из [0]:

> Почему он выдает мне только 1 строку в
>ShowMessage(Aux^.Data),а не весь список?
>Получается,что Aux=nil,после первого прохода...
> Но почему?

Я показал, почему выдает только первую строку. А то, что список неправильный я и не говорил.


sniknik   (2005-10-29 04:59:00) [9]

procedure TfrmLink.btnTestClick(Sender: TObject);
var
  NewOne, Aux: PSimpleNode;
  i: integer;
begin
  New(NewOne); //начальный указатель не трогать больше, а то потеряеш весь список.
  Aux:= NewOne;
  Aux^.Data:= 'Root 0';
  for i:= 1 to 10 do begin
    New(Aux^.Next);
    Aux:= Aux^.Next;
    Aux^.Data:= 'Next ' + IntToStr(i);
  end;

  Aux:= NewOne; //все операции после начинаются с "корня"
  while Aux <> nil do begin
     ShowMessage(Aux^.Data);
     Aux:=Aux^.Next;
  end;
end;


Defunct   (2005-10-29 02:02:00) [10]

Zeqfreed ©   (28.10.05 23:23) [1]

ну и что?
ошибки у него в организации списка нет. Код рабочий.
Ошибка в выводе списка (надо не с последнего элемента, а с первого).

John Doe ©   (28.10.05 23:10)  
Проблема в том, что список у тебя связан в обратную строну. Запоминай голову списка и не теряй ее.


Zeqfreed   (2005-10-28 23:23:00) [11]

John Doe ©   (28.10.05 23:10)

>procedure TfrmLink.FormCreate(Sender: TObject);
>begin
> Aux:=nil;
>end;
>
>procedure TfrmLink.btnTestClick(Sender: TObject);
>var NewOne: PSimpleNode;
>begin
> New(NewOne);
> NewOne^.Data:=Edit1.Text;
> NewOne^.Next:=Aux;
> Aux:=NewOne;
>
> while Aux<>nil do
>   begin
>     ShowMessage(Aux^.Data);
>     Aux:=Aux^.Next;
>   end;
>
> end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо