Помощь - Поиск - Пользователи - Календарь
Полная версия: Чуть переделать действие
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Clon
Вот я составил прогу, основываясь на материалах с этого форума по спискам.
Вот только в эти две процедуры мне надо переделать так, чтобы они добавляли элементы перед и после ЛЮБОГО элемента из списка соответственно, а не только в начало и в конец. Помогите, если не трудно
Procedure Dobnach(var L: TList; E:TElem); {Добавление элемента в начало списка}
var
N: TList;
Begin
new(N);
writeln('vvedite element');
readln(data);
if data='t' then E:=true;
if data='f' then E:=false;
N^.Info:=E;
N^.Next:=L;
L:=N
end;
procedure Dobend(L: TList; E: TElem);{Добавление элемента в конец списка}
begin
while L^.Next<>nil do L := L^.Next;
new(L^.Next );
L:=L^.Next;
writeln('vvedite element');
readln(data);
if data='t' then E:=true;
if data='f' then E:=false;
L^.Info:=E;
L^.Next:=nil
end;


Тегами пользуемся...
volvo
Как будешь указывать, перед или после КАКОГО элемента надо добавить новый? Указатель на элемент, или значение?

Если указатель на элемент, то примерно вот так (было выдрано из ООП-реализации, так что здесь может глючить... Приведи свою программу полностью для того, чтобы ее можно было проверить...):

procedure insert_before(p: plist; x: telem);
var T: plist;
begin
new(T);
T^.info := p^.info; T^.next := p^.next;
p^.next := T;
p^.info := x
end;
procedure tlist.insert_after(p: plist; x: telem);
var T: plist;
begin
new(T);
T^.info := x; T^.next := p^.next;
p^.next := T
end;
Clon
Вот программа. Кстати, сейчас еще думаю над удалением произвольного элемента. Поскольку элементы у меня типа boolean, то, я так считаю, поиск и удаление элемента производится путем указания его порядкового номера в списке
Код
program kurs83(input,output);
Type
TElem = boolean;
TList = ^TNode;
TNode = record
     Info: TElem;
     Next: TList
     end;
var
w:boolean;
data:char;
z:integer;
L:TList;
E:TElem;
Procedure ADD(var L: TList);
var
N: TList;
Begin
new(N);
writeln('vvedite element');
readln(data);
if data='t' then N^.Info:=true;
if data='f' then N^.Info:=false;
N^.Next:=nil;
L:=N
End;
Procedure Dobnach(var L: TList; E:TElem);
var
N: TList;
Begin
new(N);
writeln('vvedite element');
readln(data);
if data='t' then E:=true;
if data='f' then E:=false;
N^.Info:=E;
N^.Next:=L;
L:=N
end;
procedure Dobend(L: TList; E: TElem);
begin
while L^.Next<>nil do L := L^.Next;
new(L^.Next );
L:=L^.Next;
writeln('vvedite element');
readln(data);
if data='t' then E:=true;
if data='f' then E:=false;
L^.Info:=E;
L^.Next:=nil
end;
Procedure Del (Var L: Tlist);
Var r: Tlist;
Begin
writeln('kakoy element udalit?');
r:=L^.Next;
L^.Next:=L^.Next^.next;
r^.Next:=nil
End;
procedure Active(var L: TList);
var
H: TList;
P: TList;
begin
P := nil;
while L<>nil do
begin
  H := L^.Next;
  L^.Next := P;
  P := L;
  L:=H
end;
L :=P
end;
procedure Print(L: TList );
begin
write('< ');
while L <> nil DO
begin
  write( L^.Info );
  If L^.Next <> nil then write(',');
  L := L^.Next
end;
writeln(' >')
end;
begin
   w:=false;
   while w<>true do
   begin
      writeln('1-Noviy spisok');
      writeln('2-Dob elem v konec');
      writeln('3-Dob elem v nachalo');
      writeln('4-Deystvie');
      writeln('5-Print');
      writeln('6-del');
      writeln('7-Vihod');
      writeln('vvedite punkt menu:');
      readln(z);
      if z=1 then ADD(L);
      if z=2 then dobend(L,E);
      if z=3 then dobnach(L,E);
      if z=4 then Active(L);
      if z=5 then Print(L);
      if z=5 then del(L);
      if z=7 then w:=true;
   end;
end.

Так пойдет?
volvo
Я еще раз повторяю про ТЕГИ !!!
volvo
Ну, вот так тебя устроит? У тебя было много лишних действий, и даже лишняя процедура.
program kurs83(input,output);

Type
TElem = boolean;
TList = ^TNode;
TNode = record
Info: TElem;
Next: TList
end;

var
X: integer;
z:integer;
L:TList;
E:TElem;

function get_boolean: boolean;
var ch: char;
begin
write('enter [f, t]: '); readln(ch);
get_boolean := upcase(ch) = 'T';
end;

Procedure Insert(var L: TList; E: TElem);
var N: TList;
Begin
new(N);
N^.Info := E;
N^.Next:=L;
L:=N
End;

procedure Append(L: TList; E: TElem);
begin
while L^.Next <> nil do L := L^.Next;
new(L^.Next);
L:=L^.Next;
L^.Info := E;
L^.Next := nil
end;

procedure InsertAfter(L: TList; X: Integer; E: TElem);
Var N: TList;
begin
while (L^.next <> nil) and (X > 1) do begin
L := L^.next; Dec(X)
end;

if X = 1 then begin
New(N);
N^.info := E;
N^.next := L^.next;
L^.next := N;
end;

end;

Procedure Del (Var L: Tlist);
Var r: Tlist;
Begin
writeln('kakoy element udalit?');
r:=L^.Next;
L^.Next:=L^.Next^.next;
r^.Next:=nil
End;

procedure Active(var L: TList);
var
H: TList;
P: TList;
begin
P := nil;
while L<>nil do begin
H := L^.Next;
L^.Next := P;
P := L;
L:=H
end;
L :=P
end;

procedure Print(L: TList );
begin
write('< ');
while L <> nil DO begin
write( L^.Info );
If L^.Next <> nil then write(',');
L := L^.Next
end;
writeln(' >')
end;


begin
L := nil;
repeat
writeln('1-Noviy spisok');
writeln('2-Dob elem v konec');
writeln('3-Dob elem v nachalo');
writeln('4-Deystvie');
writeln('5-Print');
writeln('6-del');
writeln('7-insert before');
writeln('8-Vihod');
writeln('vvedite punkt menu:');
readln(z);
case z of
1, 3: Insert(L, get_boolean);
2 : Append(L, get_boolean);
4 : Active(L);
5 : Print(L);
6 : del(L);
7 :
begin
write('insert before element #'); readln(X);
if x = 1 then Insert(L, get_boolean)
else InsertAfter(L, X - 1, get_boolean);
end;
end;
until z = 8;
end.
Clon
Спасибо большое за помощь! smile.gif
Clon
Пытался вчера сделать удаление для любого элемента из списка, но что-то фигня какая-то выходит. Почему-то постоянно стирает как и нужный элемент и все те, что после него.
volvo
Цитата(Clon @ 17.05.2006 19:54)
Пытался вчера сделать удаление для любого элемента из списка, но что-то фигня какая-то выходит.
blink.gif У меня вот что вышло:
Procedure DelAfter(Var L: Tlist; X: integer);
Var
T, r: Tlist;
Begin

if X = 0 then begin
T := L;
L := L^.next;
dispose(T);
end
else begin

r := L;
while (r^.next <> nil) and (X > 1) do begin
r := r^.next; Dec(X)
end;
if X = 1 then begin

T := r^.next;
if T <> nil then r^.next := T^.next
else r^.next := T

end;

end;

End;

...
{ Вызов: }
case z of
...
6 :
begin
write('delete element #'); readln(X);
DelAfter(L, X - 1);
end;
...
end;
Вроде, работает...
Clon
Спасибо, я кажется понял, где ошибся. Вот еще такой вопрос: что значит "навигация по списку с помощью итераторов?"
volvo
Итераторов? Ты с языком программирования не ошибся? Итераторы это в С++ smile.gif
Clon
Дык мне тоже очень это интересно. В задании так и говорится - "Навигацию по списку следует реализовать с применением итераторов". Ну хорошо, а в C++ это что обозначает?
volvo
Wiki: Итератор
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.