프로그래밍을 배우기 시작했습니다.단일 링크 된 목록 - delphi
예제 이름과 성을 추가 할 수있는 (HW) 프로그램을 하나의 링크 된 목록에 추가하고이 단일 linke 목록을 표시해야합니다.
나는 그것을 시도했다, 프로그램은 컴파일하고있다 그것조차 작동하고있다. 데이터를 추가 할 수 있으며 표시됩니다. 그러나 나는 적절하게 어떤 것을 이해하지 못하고 실수를합니다. 첫 번째 사람을 추가하고 있는데, 두 번째 사람을 추가하는 것보다 표시됩니다. 또한 표시되지만 첫 번째 사람 데이터는 내가 추가 한 두 번째 사람에 의해 무시됩니다. 그래서 저는 두 개의 동일한 기록을 가지고 있습니다. 목록 상자는 하나의 링크 된 목록의 데이터 만 표시하므로 문제가없는 것으로 가정합니다. 각 포인터가 다른 데이터를 가리켜 야하므로 각 레코드가 내가 마지막으로 추가 한 레코드와 동일한 이유는 무엇입니까?
Here is my code:
type
wskaznik = ^Lista;
Lista = record
lp : string;
dane : string;
wsk : wskaznik;
end;
var
Form1 : TForm1;
First, current : wskaznik;
tekst : string;
liczba : string;
i, k : integer;
implementation
{$R *.lfm}
{ TForm1 }
procedure AddToList(dane : string; lp : string; var current : wskaznik);
var
prev, Next : wskaznik;
begin
if current <> nil then
begin
prev := current;
Next := current^.wsk;
end
else
begin
prev := nil;
Next := nil;
end;
new(current);
current^.dane := dane;
current^.lp := lp;
current^.wsk := Next;
if prev <> nil then
prev^.wsk := current;
end;
procedure GetAddr(dane : string; var First, current : wskaznik);
var
Next : wskaznik;
begin
if First <> nil then
begin
Next := First;
repeat
if Next^.wsk <> nil then
Next := Next^.wsk
until (Next^.wsk = nil) or (Next^.dane = dane);
current := Next;
end;
end;
procedure GetNum(n : integer; var First, current : wskaznik);
var
Next : wskaznik;
begin
if First <> nil then
if n = 1 then
current := First
else
if (n = 2) and (First^.wsk = nil) then
n := 0
else
begin
Next := First;
i := 1;
repeat
Inc(i);
if Next^.wsk <> nil then
Next := Next^.wsk
until (i = n) or (Next^.wsk = nil);
if (Next^.wsk = nil) and (i < n) then
n := 0
else
current := Next;
end;
end;
procedure List;
var
l : integer;
begin
form1.listbox1.Clear;
form1.listbox2.Clear;
for l := 1 to i do
begin
Getnum(l, First, current);
if l > 1 then
form1.listbox1.items.add(current^.dane);
form1.listbox2.items.add(current^.lp);
end;
end;
procedure findLess(dane : string; lp : string; var First, current : wskaznik);
var
tmp, Next : wskaznik;
begin
if First <> nil then
begin
Next := First;
repeat
if (Next^.wsk <> nil) then
begin
tmp := Next;
Next := Next^.wsk;
end;
until (Next^.wsk = nil) or (Next^.dane > dane);
if Next^.dane > dane then
current := tmp
else
current := Next;
if Next^.lp > lp then
current := tmp
else
current := Next;
end;
end;
procedure TForm1.Button1Click(Sender : TObject);
begin
Inc(i);
findLess(edit1.Text, edit2.Text, First, current);
addtolist(edit1.Text, edit2.Text, current);
label3.Caption := 'Elementów: ' + IntToStr(i - 1);
//edit1.SetFocus;
list;
end;
end.
을 할당해야합니다.이 프로그램은 하나의 링크 된 목록에 두 단어 (예 : 이름 및 성)를 추가하고 해당 목록을 표시 할 수있게해야합니다. 그러나 내가 "이름"목록을 추가 할 때마다 목록을 채우려 할 때 같은 이름으로 채워진다. –
이것은 디버그하는 방법을 배울 때입니다 –
나는 edit1에서 네가 성을 입력하고, edit2에서 성을 의심합니다? 두 목록 상자에 표시 할 내용을 설명하면 도움이됩니다. –