Спасибо огромное форуму. Смог решить 2 задачи по вставке и удалению элемента при работе с динамической памятью. Вот только не пойму как решить с помощью описанных у вас процедур 2 задачи:
1)
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;
Lapp, Как находить кандидата я разобрался с помощью вашей справки. Благодарю
Но тут просто их много и я путаюсь...
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.
Внутри Obr кто инициализировать R будет? У тебя ж там мусор...
То есть R входящий параметр?(может я неправильно назвал). Подскажите, плиз, как эту процедуру правильно завернуть...
Ты ж все написал, только чуть-чуть поправить:
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;
А вот чтобы удалять нулевой элемент, надо принять во внимание 2 вещи: во-первых, если нули начинают список, то указатель на начало списка может измениться. А во-вторых, удалять текущий элемент надо гораздо более внимательно, чем "следующий". Итого, я бы сделал твои задачи в 2-х процедурах: сначала удалить элементы после E, а потом - вот это:
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;
Спасибо огромное! Тема первая тяжелая в паскале... Я постараюсь разобраться