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

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

двухсвязные списки


Ag2002 ©   (2002-11-30 11:25:00) 

Подскажите пожалуйста, вот я инициализирою элементы динамического двухсвязного списка:

type
position = ^celltype;
celltype = record
element: integer;
next, previous: position;
end;

var
head, z: position;
...
procedure list_initialize;
begin
new(head);
new(z);
head^.previous := z;
z^.previous := nil;
end;
...

Теперь я добавляю туда данные:

procedure insert_after(sp: integer;head:position);
var
x : position;
begin
new(x);
x^.element := sp;
head^.next := x;
x^.previous := head;
end;


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

procedure ViewList;
var
Curr: position;
begin
Curr := head^.previous;
While Curr^.previous <> nil do
begin
writeln(Curr^.element);
curr :=curr^.previous;
end;
write("Все выведенно");
readln;
end;


AlexT1000   (2002-11-30 13:18:00) [1]

procedure ViewList;
var
Curr: position;
begin
Curr := head;
While Curr <> nil do
begin
writeln("Число: ", Curr^.element);
curr := curr^.next; //!!!!!!!!!!!
end;
write("Вывод списка окончен нажмите Enter.");
readln;
end;


Anatoly Podgoretsky   (2002-11-30 13:07:00) [2]

Ты на бумаге процесс разрисовал как рекомендовали?


Ag2002   (2002-11-30 13:05:00) [3]

AlexT1000
Всё работает только вот при следующем выводе, значения выводятся те что надо, но они зацикливаюся, почему, это уже циклический список получается
procedure ViewList;
var
Curr: position;
begin
Curr := head;
While Curr <> nil do
begin
writeln("Число: ", Curr^.element);
curr := curr^.previous;
end;
write("Вывод списка окончен нажмите Enter.");
readln;
end;


Ag2002   (2002-11-30 12:55:00) [4]

TTCustomDelphiMaster
При выводе получается бесконечный цикл


AlexT1000   (2002-11-30 12:43:00) [5]

procedure list_initialize;
begin
new(head);
head^.previous := head;
head^.next := nil;
end;


procedure AddNew(sp: integer);
var
temp,x : position;
begin
temp:= Head^.previous;
new(x);
x^.next := nil;
x^.previous := Head^.previous;
x^.element := sp;
temp^.Next := x;
Head^.previous := x;
end;

может так




TTCustomDelphiMaster   (2002-11-30 12:36:00) [6]


> Ag2002 (30.11.02 11:54)
> а как надо


Например так:

procedure Add(sp: integer; var head: position);
var
x : position;
begin
new(x);
x^.element := sp;
x^.previous := head;
head := x;
if not Assigned(z) then
z := head;
end;

procedure ViewList;
var
Curr: position;
begin
Curr := head;
Form1.Memo1.Clear;
While Curr <> nil do
begin
form1.Memo1.Lines.Add(Inttostr(curr^.element));
curr :=curr^.previous;
end;
end;


Юрий Зотов   (2002-11-30 12:33:00) [7]

1. Curr := head^.previous;
И после этого Curr = Z.

2. While Curr^.previous <> nil do...
Так как Curr=Z, а Z^.previous=nil, то цикл не проходится ни разу. Соответственно, ничего и не выводится.

3. Присоединяюсь к AlexT1000 - нарисуйте схему ссылок на бумаге.


AlexT1000   (2002-11-30 12:22:00) [8]

можно по разному . опиши полнее ,что тебе нужно. т.е. нафига двусвязность

что вообще нужно сделать?


Ag2002   (2002-11-30 11:54:00) [9]

а как надо


AlexT1000   (2002-11-30 11:53:00) [10]

мне кажется ты неправильно добавляешь элементы.
при новом добавлении ты теряешь ссылку на предыдущий элемент.
нарисуй схему на бумаге лучше поймешь.


Наверх

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