Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.01.2021, 14:29
Katryn Katryn вне форума
Прохожий
 
Регистрация: 03.01.2021
Сообщения: 2
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Двусвязный список Delphi, проблема с выводом

Здравствуйте. Помогите с выводом двусвязного списка в ListBox. Скорее всего ошибка в l_printl, но я не совсем понимаю в каком месте и как правильно записать код для вывода информации в очередности.

Ещё возникла проблема в операциях по помещению элемента после и перед выбранным в операциях l_insert_before и l_insert_after. Не знаю, как правильно обозначить выбранный элемент из ListBox и присвоить его данные переменной е.
За любую помощь буду благодарна)
Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
PdlistEl = ^dlistEl;
  dlistEl = record
    next : PdlistEl;
    prev : PdlistEl;
    data : integer;
  end;
 
  dlistVar = record
    head  : PdlistEl;
    tail  : PdlistEl;
    count : cardinal;
  end;
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button7: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button6: TButton;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    Button5: TButton;
    Button8: TButton;
    Button9: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
   
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure l_init (var L:dlistVar);
begin
L.head:=nil;
L.tail:=nil;
L.count:=0;
end;
 
procedure l_push_front ( var L:dlistVar; v:integer);
var p: PdlistEl;
begin
new(p);
p^.data:=v;
p^.prev:=nil;
p^.next:=L.head;
L.head:=p;
inc(L.count);
if p^.next<>nil then
p^.next^.prev:=p
else
L.tail:=p;
end;
 
procedure l_push_back ( var L:dlistVar; v:integer);
var
p:pdlistEl;
begin
new(p);
p^.data:=v;
p^.next:=nil;
p^.prev:=L.tail;
L.tail:=p;
inc(L.count);
if p^.prev<>nil then
p.prev.next:=p
else
L.head:=p;
end;
 
procedure l_insert_before( var L : dlistVar; e : PdlistEl; v : integer );
var
  p : PdlistEl;
begin
 
  if e = L.head then l_push_front ( L, v )
  else
  begin
    new ( p );
    p^.data := v;
    p^.next := e;
    p^.prev :=e.prev;
    inc ( L.count );
    e.prev.next:=p;
    e.prev:=p;
  end;
end;
 
procedure l_insert_after ( var L : dlistVar; e : PdlistEl; v : integer );
var
  p : PdlistEl;
begin
 
  if e = L.tail then l_push_back ( L, v )
  else
  begin
    new ( p );
    p^.data := v;
    p^.next := e^.next;
    p^.prev := e;
    inc ( L.count );
    e^.next^.prev := p;
    e^.next := p;
  end;
end;
 
procedure l_remove ( var L : dlistVar; e : PdlistEl );
begin
  dec ( L.count );
  if e^.prev <> nil then e^.prev^.next := e^.next
  else L.head := e^.next;
  if e^.next <> nil then e^.next^.prev := e^.prev
  else L.tail := e^.prev;
  dispose ( e );
end;
 
procedure l_pop_front ( var L : dlistVar );
begin
  if L.count > 0 then l_remove ( L, L.head );
end;
 
procedure l_pop_back ( var L : dlistVar );
begin
  if L.count > 0 then l_remove ( L, L.tail );
end;
 
procedure l_printl ( var L : dlistVar );
var
  p : pdlistEl;
begin
    p :=L.head;
    while (p <> nil) do
      begin
       Form1.ListBox1.Items.Add(IntToStr(p^.data));
    p := p^.next;
  end;
 
end;
 
 
procedure TForm1.Button1Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_push_front(L,strtoint(Edit1.text));
l_printl(L);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_insert_before(L,L.tail,strtoint(Edit1.text));
l_printl(L);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_insert_after(L,L.head,strtoint(Edit1.text));
l_printl(L);
end;
 
procedure TForm1.Button4Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_push_back(L,strtoint(Edit1.text));
l_printl(L);
end;
 
 
procedure TForm1.Button7Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_remove(L,L.head.next.next);
l_printl(L);
end;
 
 
 
 
procedure TForm1.Button8Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_pop_front(L);
l_printl(L);
end;
 
procedure TForm1.Button9Click(Sender: TObject);
var
L : dlistVar;
begin
l_init(L);
l_pop_back(L);
l_printl(L);
end;
 
 
end.
Изображения
Тип файла: png Zrzut ekranu 2021-01-03 043753.png (38.5 Кбайт, 0 просмотров)
Ответить с цитированием
  #2  
Старый 04.01.2021, 11:15
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Лень разбираться в твоем коде.
Так что пишу как оно должно быть.

1. Струкрура двусвязного списка:
Код:
type
  PLinkNode = ^TLinkNode;
  TLinkNode = record
    Data : Integer; // Ну тут данные
    Prev : PLinkNode;
    Next : PLinkNode;
  end;

Теперь проход от "головы" к "хвосту":
Код:
procedure PrintToList_H2T(head : PLinkNode; List : TListBox);
begin
  List.Items.Clear;
  While head <> Nil Do
    Begin
      List.Items.Add(IntToStr(head.Data));
      head := head.Next;
    End;
end;

Ну и в обратную сторону:
Код:
procedure PrintToList_T2H(tail : PLinkNode; List : TListBox);
begin
  List.Items.Clear;
  While tail <> Nil Do
    Begin
      List.Items.Add(IntToStr(head.Data));
      tail := tail.Prev;
    End;
end;
Ответить с цитированием
  #3  
Старый 04.01.2021, 11:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,004
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

По поводу добавления до и после.
Суть такая. Тебе надо найти нужный узел, видимо, по данным (тут есть еще вариант для упрощения - хранить готовые ссылки в итемах листбокса).
Ну и само добавление:
Код:
procedure AddItemAfter(node : PLinkNode; newNode : PLinkNode);
begin
  newNode.next := node.Next;
  newNode.prev := node;
  node.Next := newNode;
end;

procedure AddItemBefore(node : PLinkNode; newNode : PLinkNode);
begin
  AddItemAfter(node.Prev,newNode);
end;

Здесь нет проверки на добавление перед первым и после последнего элементов, но там просто, сам сделаешь.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:49.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter