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

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

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

> Удаление элементов в списках
Tribunal
сообщение 26.04.2006 10:14
Сообщение #1


Бывалый
***

Группа: Пользователи
Сообщений: 233
Пол: Женский
Реальное имя: Dasha

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


Мне нужно удалить из списка элементы, встречающиеся ровно 2 раза.

вот то,что у меня получилось,
но ,по-видимому, программа не удаляет нужные элементы.
подскажите,пожалуйста,почему...

Код
var
   temp:integer;
   k:byte;
   p,h:t_ptr;
begin
t:=first;
while t^.next<>nil do
begin
   k:=0;
   p:=t^.next;
   while p<>nil do
    begin
      if p^.inf=t^.inf then begin
                            inc(k);
                            if k=2 then temp:=p^.inf;
                            end;
      p:=p^.Next;
    end;
   if k=2 then begin
               h:=first;
               while h<>nil do
                begin
                  if h^.inf=temp then dispose(h);
                  h:=h^.next;
                end;
               end;
   t:=t^.next;
end;
t:=first;
while t<>nil do
  begin
    writeln(t^.inf);
    t:=t^.next;
  end;


Сообщение отредактировано: Tribunal - 26.04.2006 10:53


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 26.04.2006 17:17
Сообщение #2


Гость






Задачка-то совсем не простая...
Я тут !smoke2.gif подумал, и вот что получилось (только протестируй, я тестировал на 3-х последовательностях, вроде работает):
type
t_ptr = ^TT;
TT = record
inf: integer;
next: t_ptr;
end;

var
i, n, k: integer;
disp: array[1 .. 2] of t_ptr;
first, t, p, h: t_ptr;

begin
first := nil;
readln(n);
while n > 0 do begin
new(p);
p^.next := first;
p^.inf := n;
first := p;
readln(n);
end;

t := first;
while t <> nil do begin
write(t^.inf:4);
t := t^.next;
end;
writeln;

t := first;
while t^.next <> nil do begin

p := first;

if first^.inf = t^.inf then k := 1 else k := 0;

while p^.next <> nil do begin
if p^.next.inf = t^.inf then inc(k);
p := p^.next;
end;

if k = 2 then begin

p := first;
i := 1;
while p^.next <> nil do begin
if p^.next.inf = t^.inf then begin

h := p^.next; p^.next := h^.next;
disp[ i ] := h; inc(i);

end;
p := p^.next;
end;

if first^.inf = t^.inf then begin
p := first;
first := first^.next;
disp[ i ] := p;
end;

for i := 1 to 2 do
dispose(disp[ i ]);
t := first;

end
else t := t^.next;
end;


t := first;
while t <> nil do begin
write(t^.inf:4);
t := t^.next;
end;
writeln;

end.

Тестировалось на этом (вводи без символов, только числа, после каждого - Enter):
1 тест: <1, 2, 3, 2, 4, 5, 3, 3, 7, 0>
2 тест: <2, 1, 2, 3, 2, 4, 5, 3, 3, 7, 5, 0>
3 тест: <2, 1, 2, 3, 2, 4, 5, 3, 3, 7, 8, 8, 5, 0>

Вопрос на засыпку: что будет, если в исходном списке меньше 2-х элементов? И как этого избежать?
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 



- Текстовая версия 26.07.2025 6:44
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"