我开始学习编程。
我必须做(HW)程序,我可以在其中添加示例名称和姓氏,将其添加到单个链接列表,然后显示此单个链接列表。
我试图这样做,程序正在编译,它甚至正在工作。我可以添加数据并显示。但我可能不会理解某些事情并犯错误。我添加第一个人,显示,比我添加第二个人,它也显示但第一人称数据被我添加的第二个人覆盖。所以我有两个相同的记录。列表框只显示单个链表中的数据,所以我认为没有问题。每个指针应指向不同的数据,为什么每条记录与我添加的最后一条记录相同?
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.
答案 0 :(得分:2)
您永远不会向First
分配任何内容(假设First
是列表的开头)。
第一次调用AddToList时,您应该将Current
分配给First