링크드 리스트의 개념은 어렵지 않은데, C만 쓰다보니 델파이의 포인터와 쪼끔 다른 기호 사용들에 처음에 많이 헤멨다. 심지어 예제 소스도 거의 없는 편... 아주 간단한 예제이지만 Linked List의 틀을 가지고 있으니까 약간의 응용을 더하면 되지 않을까싶다.


간단하게 이름과 포인터를 가진 구조체를 선언하고, ListBox컴포넌트를 이용해서 내용을 출력하는 예제이다.


(2018.02.09 업데이트)

기본적인 구조체, 포인터의 선언과 삽입 프로시저, 출력 프로시저.



unit linkedlist;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  PExam = ^TExam;
  TExam = record
    iName : String;
    iNext : PExam;
  end;
  TForm1 = class(TForm)
    Edit1: TEdit;
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    tHead : PExam;

    procedure Add(aData : String);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
procedure TForm1.Add(aData : String);
var
  aNewNode : PExam;
  aHead : PExam;
begin
  new(aNewNode);
  aNewNode.iNext := nil;
  aHead := tHead;
  if tHead = nil then begin
    tHead := aNewNode;
    aNewNode.iName := aData;
  end else begin
    while aHead^.iNext <> nil do
      aHead := aHead^.iNext;
    aHead^.iNext := aNewNode;    // 마지막 노드를 가리킬 때 가리키는 노드의 iNext에 aNewNode를 연결
    aHead := aHead^.iNext;          // 추가한 마지막 노드를 가리킴
    aHead^.iName := aData;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  aHead : PExam;
begin
  aHead := tHead;
  Add(Edit1.Text);
  ListBox1.Clear;
  if aHead = nil then
  else begin
    ListBox1.Items.Add(aHead^.iName);
    while aHead^.iNext <> nil do begin
      aHead := aHead^.iNext;       
      ListBox1.Items.Add(aHead^.iName);
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  tHead := nil;
end;

end.



+ Recent posts