IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача на ссылочные типы данных, Не выходит решить...
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Спасибо огромное форуму. Смог решить 2 задачи по вставке и удалению элемента при работе с динамической памятью. Вот только не пойму как решить с помощью описанных у вас процедур 2 задачи:

1)
type tip_elem=integer;
ukaz=^dinam;
dinam=record
ed:tip_elem;
next:ukaz;
end;
.
Удалить из списка Ukaz за каждым вхождением элемента Е один элемент отличный от Е (если он есть).

2) Певая часть условия совпадает... Удалить из списка Ukaz все нули
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(Eskel @ 23.12.2008 0:59) *
1)
type tip_elem=integer;
ukaz=^dinam;
dinam=record
ed:tip_elem;
next:ukaz;
end;
Удалить из списка Ukaz за каждым вхождением элемента Е один элемент отличный от Е (если он есть).

2) Певая часть условия совпадает... Удалить из списка Ukaz все нули

Насколько я понял, тебя затрудняет удаление элементов из списка. В этом нет ничего сложного, нужно просто завести буферный указатель и положить в него значение указателя из удаляемого элемента. Затем освободить память (либо Dispose, либо FreeMem - в зависимости, как брал), занимаемую удаляемым элментом и присвоить указателю на него значение, сохраненное в буфере.

А нахождение кандидата на удаление - это вряд ли сложно. Или тоже объяснить?


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






  while r <> nil do begin
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;

R - корень списка... Кстати, на будущее, Eskel, показывай, как заполняешь список, если уж говоришь, что реализовал...

А теперь у меня к тебе просьба: прокомментируй мою программу, пожалуйста, чтобы было ясно, понял ты ее или нет...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Цитата
А теперь у меня к тебе просьба: прокомментируй мою программу, пожалуйста, чтобы было ясно, понял ты ее или нет...

Ну если комментировать пошагово:
Делаем цикл по элементам списка.
Сравниваем текущую фактическую часть с вводимым значением с клавы.
Ну понятно, если равно, то надо найти число отлично от Е, то тогда
t присваиваем знач ссылки r.(t видимо тоже ukaz) и меняем ссылку r на ссылку t.
Освобождаем память.
Ну и для продолжения цикла стандартно r := r^.next; ... Еще лучше я разберусь, когда сейчас попробую осуществить это все в проге.

Заполнял я список так...
 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;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Lapp, Как находить кандидата я разобрался с помощью вашей справки. Благодарю smile.gif

Но тут просто их много и я путаюсь...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


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.

nea.gif Вот, что я пытался сделать...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Внутри Obr кто инициализировать R будет? У тебя ж там мусор...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


То есть R входящий параметр?(может я неправильно назвал). Подскажите, плиз, как эту процедуру правильно завернуть...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Ты ж все написал, только чуть-чуть поправить:

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;


Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Спасибо! А чтобы удалять текущий элемент надо делать как у вас с помощью поиска ссылки на текущий элемент? или можно также в одной процедуре?
 procedure obr(r:ukazat);
var h:ukazat;
begin
while r<>nil do begin
if r^.ed=0 then begin
...
r:=r^.next end end;

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






А вот чтобы удалять нулевой элемент, надо принять во внимание 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;
Что непонятно - спрашивай...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской
Реальное имя: Илья

Репутация: -  0  +


Спасибо огромное! Тема первая тяжелая в паскале... Я постараюсь разобраться
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.04.2024 6:49
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name