1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Задача на ссылочные типы данных, Не выходит решить...
Спасибо огромное форуму. Смог решить 2 задачи по вставке и удалению элемента при работе с динамической памятью. Вот только не пойму как решить с помощью описанных у вас процедур 2 задачи:
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;
Удалить из списка Ukaz за каждым вхождением элемента Е один элемент отличный от Е (если он есть).
2) Певая часть условия совпадает... Удалить из списка Ukaz все нули
Насколько я понял, тебя затрудняет удаление элементов из списка. В этом нет ничего сложного, нужно просто завести буферный указатель и положить в него значение указателя из удаляемого элемента. Затем освободить память (либо Dispose, либо FreeMem - в зависимости, как брал), занимаемую удаляемым элментом и присвоить указателю на него значение, сохраненное в буфере.
А нахождение кандидата на удаление - это вряд ли сложно. Или тоже объяснить?
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
while r <> nildobeginif r^.ed = E thenif (r^.next <> nil) and (r^.next^.ed <> E) thenbegin
t := r^.next;
r^.next := t^.next;
dispose(t);
end;
r := r^.next;
end;
R - корень списка... Кстати, на будущее, Eskel, показывай, как заполняешь список, если уж говоришь, что реализовал...
А теперь у меня к тебе просьба: прокомментируй мою программу, пожалуйста, чтобы было ясно, понял ты ее или нет...
А теперь у меня к тебе просьба: прокомментируй мою программу, пожалуйста, чтобы было ясно, понял ты ее или нет...
Ну если комментировать пошагово: Делаем цикл по элементам списка. Сравниваем текущую фактическую часть с вводимым значением с клавы. Ну понятно, если равно, то надо найти число отлично от Е, то тогда t присваиваем знач ссылки r.(t видимо тоже ukaz) и меняем ссылку r на ссылку t. Освобождаем память. Ну и для продолжения цикла стандартно r := r^.next; ... Еще лучше я разберусь, когда сейчас попробую осуществить это все в проге.
Заполнял я список так...
begin
clrscr;
h:=nil;
writeln('vvedite kol-vo zapisey');
readln(n);
for i:=1to n dobegin
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=nilthen h:=p
elsebegin
pr:=h;
while pr^.next<>nildo
pr:=pr^.next;
pr^.next:=p;
end;
end;
procedure obr(e:tip_elem; r:ukazat); { <--- указатель на первый элемент изменяться не может }var h:ukazat; { для временного хранения указателя на удаляемый элемент }beginwhile r<>nildobeginif r^.ed=e thenif (r^.next<>nil) and (r^.next^.ed<>e) thenbegin
h:=r^.next;
r^.next:=h^.next;
dispose(h);
end;
r:=r^.next
end;
end;
А вот чтобы удалять нулевой элемент, надо принять во внимание 2 вещи: во-первых, если нули начинают список, то указатель на начало списка может измениться. А во-вторых, удалять текущий элемент надо гораздо более внимательно, чем "следующий". Итого, я бы сделал твои задачи в 2-х процедурах: сначала удалить элементы после E, а потом - вот это:
procedure del_zeroes(var root: ukaz);
var
r, t, pred: ukaz;
delete: boolean;
beginwhile root^.ed = 0dobegin
t := root;
root := root^.next;
dispose(t);
end;
pred := root; r := root^.next;
while r <> nildobegin
delete := false;
if r^.ed = 0thenbegin
t := r;
pred^.next := r^.next;
delete := true
endelse pred := r;
r := r^.next;
if delete then dispose(t);
end;
end;