Помощь - Поиск - Пользователи - Календарь
Полная версия: Списки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Izmort
предположим, что уже построен и задан указателем P однонаправленный список элементами которого являются целые числа. Написать программу, которая из списка P удаляет все вхождения элемента E.

Подскажите, пожалуйста, как создать список в котором будут оба вида указателей - как E так и P?

Ниже я привел мои "старания", процедура построения списка и выведения на экран.



program S2L2_1  ;


type P_item1 = ^item1;
     item1 = record
     info : integer;
     next : P_item1;
     end;

type E_item2 = ^item2;
     item2 = record
     info : integer;
     next : E_item2;
     end;

var P_begin,P_temp : P_item1; E_temp: E_item2;
      n : integer;


 procedure Form;
   var element,k : integer;
  begin
     randomize;
     k:=20;
     New(P_begin);
      element:= random(10);
    P_begin^.info := element;
    P_begin^.next := nil;
    P_temp := P_begin;
      k:=k-1;
	 while k<>0 do
	  begin
	    element:=random(50);
	    new (P_temp^.next);
	    P_temp := p_temp^.next;
	    P_temp^.info := element;
	    P_temp^.next := nil;
	    element:=random(5);
	    new (E_temp^.next);
	    E_temp := E_temp^.next;
	    E_temp^.info := element;
	    E_temp^.next := nil;
	    k:=k-1;
	  end;
  end;

procedure Print;
  begin
    P_temp := P_begin;
    write(' ',P_temp^.info);
    P_temp := P_temp^.next;
      while E_temp <> nil do
	begin
	write(' ',P_temp^.info);
	P_temp := E_temp^.next;
	write(' ',E_temp^.info);
	E_temp := P_temp^.next;
	end;
    writeln;
  end;



begin

Form;
Print;
readln;

end.


Это конечно же не работает... Но я уже не знаю что еще можно сделать...
помогите пожалуйста, у меня уже нет сил издеваться над этой задачей...
Lapp
Цитата(Izmort @ 2.06.2009 14:02) *
Подскажите, пожалуйста, как создать список в котором будут оба вида указателей - как E так и P?
Что ты понимаешь под "видом Е"? blink.gif Как я понимаю, есть список целых чисел. Теперь тебе задают некое Е, и нужно убрать все элементы, которые его содержут. Например, Е=25. Ты должен убрать все элементы списка, содержащие число 25.

А как еще это можно понимать?
Izmort
Я не знаю... Лично я думал, что есть список, он строиться указателем с именем P, потом в него допустим позапихивали из другого списка, где указатель завется E, тоже какие-то элементы.. и мне надо их удалить... я думаю так, но если мне кто-нить растолкует что я не прав, то соглашусь с иным мнением...

Добавлено через 2 мин.
И тогда вопрос в другом - мне нужно искать элементы, которые содержат инфу, например тот же 25 и удалять их?
Lapp
Цитата(Izmort @ 2.06.2009 14:50) *
И тогда вопрос в другом - мне нужно искать элементы, которые содержат инфу, например тот же 25 и удалять их?
Ну да, наверное. Ну, перечитай еще раз условие:
Цитата(Izmort @ 2.06.2009 14:02) *
удаляет все вхождения элемента E

Видишь? Речь идет не про "список Е", а про "элемент Е". Или я уже не понимаю Russian..
Izmort
Скорее я его не понимаю...)) Спс за разъяснение) Тогда, по-моему алгоритм сводиться поочередному анализу элементов в списке Р и если очередной элемент равен Е, то его нужно удалить, если я не ошибаюсь.
Вопрос в другом как написать процедуру поочередного анализа элементов?

имхо получатся так:


type P_item = ^item;
     item = record
     info : integer;
     next : P_item;
  end;
{Тут строиться список}
  var P_begin,P_temp : P_item;
      n, e, x : integer;
 procedure Form;
   var element,k : integer;
  begin
     randomize;
     k:=random(100);
     New(P_begin);
      element:= random(20);
    P_begin^.info := element;
    P_begin^.next := nil;
    P_temp := P_begin;
      k:=k-1;
         while k<>0 do
          begin
            element:=random(10);
            new (P_temp^.next);
            P_temp := p_temp^.next;
            P_temp^.info := element;
            P_temp^.next := nil;
            k:=k-1;
          end;
  end;

{Тут мы выводим его на экран}
 procedure Print;
  begin
    P_temp := P_begin;
      while P_temp <> nil do
        begin
          write(' ',P_temp^.info);
          P_temp := P_temp^.next;
        end;
    writeln;
  end;

{Удаление Е из списка}
procedure DelE;
begin
writeln('BBedume E');
readln(E);
P_temp := P_begin;
 while P_temp <> nil do;
  begin
   x:=P_temp^.info;
   if x=e then  P_temp := P_temp^.next;
   P_temp^.next := P_temp^.next^.next;
   Dispose(P_temp);
   else P_temp := p_temp^.next;
 end;
end;

begin
Form;
Print;
DelE;
Print;
readln;
end.
 



только ошибка вылезает в этой строчке else P_temp := p_temp^.next;
volvo
Цитата
только ошибка вылезает в этой строчке else P_temp := p_temp^.next;
У тебя программа вообще некомпилируемая, до ошибки еще как до луны... Смотри внимательно, в процедуре DelE, где у тебя ветка else, и к чему она относится... Ты Begin/End не забыл часом?

А вообще, по-моему, тема давно просится в "Задачи", алгоритмами тут уже и не пахнет, пошла чистая реализация...
Izmort
Задачи, пусть задачи...

type P_item = ^item;
     item = record
     info : integer;
     next : P_item;
  end;
{Тут строиться список}
  var P_begin,P_temp : P_item;
      n, e, x : integer;
 procedure Form;
   var element,k : integer;
  begin
     randomize;
     k:=random(100);
     New(P_begin);
      element:= random(20);
    P_begin^.info := element;
    P_begin^.next := nil;
    P_temp := P_begin;
      k:=k-1;
         while k<>0 do
          begin
            element:=random(10);
            new (P_temp^.next);
            P_temp := p_temp^.next;
            P_temp^.info := element;
            P_temp^.next := nil;
            k:=k-1;
          end;
  end;

{Тут мы выводим его на экран}
 procedure Print;
  begin
    P_temp := P_begin;
      while P_temp <> nil do
        begin
          write(' ',P_temp^.info);
          P_temp := P_temp^.next;
        end;
    writeln;
  end;

{Удаление Е из списка}
procedure DelE;
begin
writeln('BBedume E');
readln(E);
P_temp := P_begin;
 while P_temp <> nil do;
  begin
   x:=P_temp^.info;
   if x=e then  
   Begin
   P_temp := P_temp^.next;
   P_temp^.next := P_temp^.next^.next;
   Dispose(P_temp);
   end
   else P_temp := p_temp^.next;
 end;
end;

begin
Form;
Print;
DelE;
Print;
readln;
end.
 



тока теперь она виснет, где ошибка? Подскажите плз
volvo
Бррр... Во-первых, ты как-то не очень красиво заполняешь список, можно сделать это проще... А во вторых:
while P_temp <> nil do;
в процедуре DelE... Вот эта точка с запятой - лишняя явно, цикл получается пустой, и условие никогда не выполняется. Вот и зацикливается... Это - навскидку, проверить сейчас негде...
Izmort
Спс, теперь не зацикливается. Но все равно работает не правильно, теперь совершенно непонятным для меня образом... могу скинуть один из результатов
volvo
Смотри... Формируем список так:
procedure Form;
var
  k: integer;
  p_end: p_item;
begin
  randomize;
  k:=random(100);
  p_begin := nil;

  while k > 0 do begin
    new(p_temp);
    p_temp^.info := random(10);
    p_temp^.next := nil;

    if p_begin = nil then p_begin := p_temp
    else p_end^.next := p_temp;

    p_end := p_temp;
    k := k - 1;
  end;
end;
, удаляем элемент E - вот так:
procedure DelE;
var p: p_item;
begin
  writeln('BBedume E');
  readln(E);
  P_temp := P_begin;
  while (p_temp <> nil) and (P_temp^.next <> nil) do
  begin
    if p_temp^.next^.info=e then Begin
      p := p_temp^.next;
      p_temp^.next := p^.next;
      Dispose(P);
   end
   else P_temp := p_temp^.next;
 end;
end;
Это - почти все, что нужно... После этого надо проверить первый элемент на равенство E, и если равен - то удалить его... Доделай это сам (очень трудно теоретически что-то советовать, не имея под рукой компилятора). По-моему, нигде не ошибся, проверяй...
Izmort
Большое спасибо за помощь!
Вот конечный вариант программы

type P_item = ^item;
     item = record
     info : integer;
     next : P_item;
end;

var P_begin,P_temp : P_item;
    e: integer;


procedure Form; {формируем список}
var element,k : integer;
P_end: P_item;
begin
   randomize;
   k:=random(100);
   P_begin := nil;
    while k>0 do
     begin
     new(P_temp);
     P_temp^.info := random(10);
     P_temp^.next := nil;
      if P_begin = nil then P_begin := P_temp
      else P_end^.next := P_temp;
      P_end := P_temp;
      k:=k-1;
   end;
end;


procedure Print; {Выводим на экран список}
begin
    P_temp := P_begin;
      while P_temp <> nil do
	begin
	  write(' ',P_temp^.info);
	  P_temp := P_temp^.next;
	end;
writeln;
end;

procedure DelE; {Удаляем элемент Е}
var P: P_item;
begin
writeln('BBedume E');
readln(E);

P_temp := P_begin;

 while (P_temp <> nil) and (P_temp^.next <> nil) do
  begin
   if P_temp^.next^.info = e then
    begin
    P := P_temp^.next;
    P_temp^.next := P^.next;
    Dispose(P);
    end
   else P_temp := p_temp^.next;
 end;
end;

procedure DelEN; {Удаляем из начала, если первый элемент равен Е}
var P: P_item;
begin
P_temp := P_begin;
If P_temp^.info = e then
begin
P := P_begin;
P_begin := P_Begin^.next;
Dispose(P);
end;
end;

begin
Form;
Print;
DelE;
DelEN;
Print;
readln;
end.


Глядишь кому-нибудь пригодиться
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.