2015-01-22 3 views
1

Я начинаю изучать программирование.Одиночный список - delphi

Мне нужно сделать (HW) программу, где я могу добавить в пример имя и фамилию, добавить его в единственный связанный список и отобразить этот единственный список ссылок.

Я попытался это сделать, программа компилирует и даже работает. Я могу добавить данные, и он отображается. Но я, возможно, что-то недостойно и ошибаюсь. Я добавляю первого человека, он отображается, чем я добавляю второго человека, он также отображается, но данные первого лица переопределяются вторым добавленным мной человеком. Поэтому у меня две записи. Listbox показывает только данные из единственного связанного списка, поэтому я полагаю, что проблем нет. Каждый указатель должен указывать разные данные, поэтому почему каждая запись такая же, как и последняя, ​​которую я добавил?

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, вы должны назначить CurrentFirst

Смежные вопросы