簡體   English   中英

單鏈表-Delphi

[英]Single linked list - delphi

我開始學習編程。

我必須執行(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. 

您永遠不會為“ First分配任何內容(假設“ First將成為列表的開頭)。 第一次調用AddToList時,應將Current分配給First

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM