Консультация № 66346
10.12.2006, 13:59
0.00 руб.
0 1 1
Уважаемые эксперты, помогите найти ошибку:
В программе существует процедура print (u), которая выводит список на экран. Если использовать её один раз, то она работает. Но если использовать 2, как представленно в программе, конечный список будет пустым. Почему?

Приложение:
Program vstavka_elem_v_nachalo_spiska;Uses crt;type list=^s; {opredeljaen novij tip} s = record data :integer; next :list; end;VAR u,y :list; j,i,l,x,z :integer;Procedure Init1 (j :integer; var u :list); {procedura dobavlenija novogo elementa v nachalo spiska}var x :list; i :integer;beginwriteln (‘vvedite spisok‘);u := nil;writeln (‘Vvedite spisok. Konec znachenie 0‘);if j = 1 then read (i) else i := random(10);if i <> 0 then begin new (x); {Sozdaem pervij element} x^.next := nil; x^.data := i; u := x; if j = 1 then read (i) else i := random (10); while i <> 0 do begin new (x^.next); {Sozdanie posledujyshix elementov} x := x^.next; x^.next := nil; x^.data := i; if j = 1 then read (i) else i := random(10); end; writeln; end;end;Procedure Init2 (j :integer; var u :list); {procedura dobavlenija novogo elementa v konec spiska}var x :list; i :integer;beginu := nil;writeln (‘vvedite spisok. Konec znachenie 0‘);if j = 1 then read (i) else i := random(10);if i <> 0 then begin new (x); {Sozdanie pervogo elementa} x^.next := nil; x^.data := i; u := x; if j = 1 then read (i) else i := random(10); while i <> 0 do begin new (x); {Sozdanie posledujyshix elementov} x^.data := i; x^.next := u; u := x; if j = 1 then read (i) else i := random(10); end; writeln; end;end;procedure dobav ( a,b :integer; var u :list); {procedura dobavlenija posle kakogo-to elementa}{a-posle kakogo vstavljaem; b-chto za element vstavljaem}var dx, px, x,h :list;beginnew (x); {Sozdaem element, kotorij nugno dobavljat}x^.data := b;x^.next := nil;y := u;while y <> nil do begin dx := y^.next; px := y; if y^.data = a then begin px^.next := x; x^.next := dx; y := x; end; y := y^.next; end;end;procedure print (var u :list); {procedura vivoda}beginwriteln (‘Spisok‘);while u <> nil do begin write (u^.data,‘ ‘); u := u^.next; {perehod na sledujushij element spiska} end;end;BEGINClrScr;randomize;u := nil;Writeln (‘esli vi xodite vvodit elementi v nachalo - nagmite 1. V konec - 2‘);Read (i);Writeln (‘kakim sposobov zapisivaetsja spisok; 1-s klavi; 2-sluchajnim obrazom‘);Read (j);If i = 1 then Init1 (j,u) else Init2 (j,u);print (u);writeln;Writeln (‘posle kakogo elementa nado vstavlat‘);Readln (z);Writeln (‘‘kakoi element nado vstavljat‘);Readln (x);dobav (z,x,u);print (u);readln;readln;END.

Обсуждение

Неизвестный
10.12.2006, 16:12
общий
это ответ
Здравствуйте, MariaErohina!
В процедуру print указатель u передается по ссылке (var).
В ней он изменяется, поэтому при втором вызове print,
он будет другим (будет указывать в конец списка).
Нужно передавать его по значению:
procedure print (u :list);
Удачи!
Форма ответа