|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Двусвязный список 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. |
#2
|
|||
|
|||
Лень разбираться в твоем коде.
Так что пишу как оно должно быть. 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
|
|||
|
|||
По поводу добавления до и после.
Суть такая. Тебе надо найти нужный узел, видимо, по данным (тут есть еще вариант для упрощения - хранить готовые ссылки в итемах листбокса). Ну и само добавление: Код:
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; Здесь нет проверки на добавление перед первым и после последнего элементов, но там просто, сам сделаешь. |