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