![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
двухсвязные списки
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]мне кажется ты неправильно добавляешь элементы.
при новом добавлении ты теряешь ссылку на предыдущий элемент.
нарисуй схему на бумаге лучше поймешь.