1)
type tip_elem=integer;.
ukaz=^dinam;
dinam=record
ed:tip_elem;
next:ukaz;
end;
Удалить из списка Ukaz за каждым вхождением элемента Е один элемент отличный от Е (если он есть).
2) Певая часть условия совпадает... Удалить из списка Ukaz все нули
type tip_elem=integer;.
ukaz=^dinam;
dinam=record
ed:tip_elem;
next:ukaz;
end;
type tip_elem=integer;Удалить из списка Ukaz за каждым вхождением элемента Е один элемент отличный от Е (если он есть).
ukaz=^dinam;
dinam=record
ed:tip_elem;
next:ukaz;
end;
while r <> nil do beginR - корень списка... Кстати, на будущее, Eskel, показывай, как заполняешь список, если уж говоришь, что реализовал...
if r^.ed = E then
if (r^.next <> nil) and (r^.next^.ed <> E) then
begin
t := r^.next;
r^.next := t^.next;
dispose(t);
end;
r := r^.next;
end;
begin
clrscr;
h:=nil;
writeln('vvedite kol-vo zapisey');
readln(n);
for i:=1 to n do begin
write('chislo ');
readln(e);
addel(h,e) end;
...
...
...
procedure addel(var h:ukazat; e:tip_elem);
var p,pr:ukazat;
begin
new(p);
p^.ed:=e;
p^.next:=nil;
if h=nil then h:=p
else begin
pr:=h;
while pr^.next<>nil do
pr:=pr^.next;
pr^.next:=p;
end;
end;
program dina;
uses crt;
type tip_elem=integer;
ukazat=^dinam;
dinam=record
ed:tip_elem;
next:ukazat;
end;
var h:ukazat;
e:tip_elem;
i,n:integer;
procedure addel(var h:ukazat; e:tip_elem);
var p,pr:ukazat;
begin
new(p);
p^.ed:=e;
p^.next:=nil;
if h=nil then h:=p
else begin
pr:=h;
while pr^.next<>nil do
pr:=pr^.next;
pr^.next:=p;
end;
end;
procedure show(h:ukazat);
begin
writeln('==========');
while h<>nil do begin
writeln(h^.ed);
h:=h^.next;
end;
end;
procedure delsp(var h:ukazat);
var p:ukazat;
begin
while h<>nil do begin
p:=h^.next;
dispose(h);
h:=p;
end;
end;
procedure obr(e:tip_elem; var h:ukazat);
var r:ukazat;
begin
while r<>nil do begin
if r^.ed=e then
if (r^.next<>nil) and (r^.next^.ed<>e) then begin
h:=r^.next;
r^.next:=h^.next;
dispose(h); end;
r:=r^.next end;
end;
begin
clrscr;
h:=nil;
write('vvedite kol-vo zapisey ');
readln(n);
for i:=1 to n do begin
write('chislo ');
readln(e);
addel(h,e) end;
show(h);
writeln('vvedite element E');
readln(e);
obr(e,h);
show(h);
delsp(h);
show(h);
readln
end.
procedure obr(e:tip_elem; r:ukazat); { <--- указатель на первый элемент изменяться не может }
var h:ukazat; { для временного хранения указателя на удаляемый элемент }
begin
while r<>nil do begin
if r^.ed=e then
if (r^.next<>nil) and (r^.next^.ed<>e) then begin
h:=r^.next;
r^.next:=h^.next;
dispose(h);
end;
r:=r^.next
end;
end;
procedure obr(r:ukazat);
var h:ukazat;
begin
while r<>nil do begin
if r^.ed=0 then begin
...
r:=r^.next end end;
procedure del_zeroes(var root: ukaz);Что непонятно - спрашивай...
var
r, t, pred: ukaz;
delete: boolean;
begin
while root^.ed = 0 do begin
t := root;
root := root^.next;
dispose(t);
end;
pred := root; r := root^.next;
while r <> nil do begin
delete := false;
if r^.ed = 0 then begin
t := r;
pred^.next := r^.next;
delete := true
end
else pred := r;
r := r^.next;
if delete then dispose(t);
end;
end;