Уважаемые программисты, помогите справиться с задачей
Нужно поменять второй и последний элементы односвязного линейного списка местами. Есть код, меняющий наоборот первый и предпоследний элементы списка! ЧТо нужно исправить?
| Код |
program list; uses crt; type u=^zap; zap=record inf:integer; ukz:u; end; var PSP:u; ch:char;
procedure create_list(var PSP:U); var Q, P: U; Ch: Char; Begin New(Q); Writeln('VVedute informatsionnoe pole elementa'); Readln(Q^.INF); PSP:=Q; Writeln('Prodolzhit vvod& y/n'); Ch:=ReadKey; while Ch in ['y','Y'] do Begin New(P); Writeln('VVedite informatsionnoe pole elementa'); Readln(P^.INF); Q^.UKZ:=P; Q:=P; Writeln('Prodolzhit vvod& y/n'); Ch:=ReadKey; End; Q^.UKZ:=Nil; End;
procedure print_list(PSP:U); Var t:u; Begin if PSP=nil then begin Writeln('Spisok pust'); Readkey; Exit; end; Writeln('Soderzhimoe spiska'); t:=PSP; while t<>nil do begin write(t^.inf,' --> '); t:=t^.ukz; end; Writeln('NIL'); Writeln('Nazhmite lyubuyu klavishu..'); Readkey; End;
procedure destroy_list(var PSP:u); var t:u; Begin while PSP<>nil do begin t:=PSP; PSP:=PSP^.ukz; dispose(t); end; End;
procedure edit_list(var PSP:u); var q,s,t:u; Begin if (PSP=nil) or (PSP^.ukz=nil) or (PSP^.ukz^.ukz=nil) then begin Writeln('V spiske menshe treh elementov, zadanaya obrabotka nevozmozhna'); print_list(PSP); Exit; end; q:=PSP; s:=PSP^.ukz; while s^.ukz^.ukz<> nil do begin q:=s; s:=s^.ukz; end; if q=PSP then begin q^.ukz:=s^.ukz; s^.ukz:=q; PSP:=s; Writeln('Obmen 1-go i 2-go elementa vipolnen'); Readkey; Exit; end; t:=PSP^.ukz; PSP^.ukz:=s^.ukz; s^.ukz:=t; q^.ukz:=PSP; PSP:=s; Writeln('Obmen 1-go i 2-go elementa vipolnen'); Readkey; End;
Begin PSP:=nil; repeat Clrscr; Writeln('1. Sozdat spisok'); Writeln('2. Prosmotret spisok'); Writeln('3. Pomenyat mestami perviy i predposlednij elementi spiska'); Writeln('4. Udalit spisok'); Writeln('-----------------------------------------------'); Writeln('0. Vihod'); Writeln; Writeln('Vash vibor: '); ch:=Readkey; Writeln(ch); Writeln;
Case ch of '1': begin psp:=nil; create_list(PSP); end; '2': print_list(PSP); '3': edit_list(PSP); '4': begin destroy_list(PSP); Writeln('Spisok udalen!'); Readkey; end; end; until ch='0'; end.
|
M Rrader | Модератор: Название темы должно отражать ее суть! |
|