2015-01-22 2 views
1

프로그래밍을 배우기 시작했습니다.단일 링크 된 목록 - 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. 
+0

을 할당해야합니다.이 프로그램은 하나의 링크 된 목록에 두 단어 (예 : 이름 및 성)를 추가하고 해당 목록을 표시 할 수있게해야합니다. 그러나 내가 "이름"목록을 추가 할 때마다 목록을 채우려 할 때 같은 이름으로 채워진다. –

+4

이것은 디버그하는 방법을 배울 때입니다 –

+0

나는 edit1에서 네가 성을 입력하고, edit2에서 성을 의심합니다? 두 목록 상자에 표시 할 내용을 설명하면 도움이됩니다. –

답변

2

당신은 First에 아무것도 지정하지는 (First 목록의 시작이 될 것입니다 가정). 처음 AddToList를 호출하면 에 First