Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Чуть переделать действие

Автор: Clon 15.05.2006 22:04

Вот я составил прогу, основываясь на материалах с этого форума по спискам.
Вот только в эти две процедуры мне надо переделать так, чтобы они добавляли элементы перед и после ЛЮБОГО элемента из списка соответственно, а не только в начало и в конец. Помогите, если не трудно

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 15.05.2006 22:38

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

Если указатель на элемент, то примерно вот так (было выдрано из http://forum.pascal.net.ru/index.php?s=&showtopic=10788&view=findpost&p=68612, так что здесь может глючить... Приведи свою программу полностью для того, чтобы ее можно было проверить...):

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 15.05.2006 22:43

Вот программа. Кстати, сейчас еще думаю над удалением произвольного элемента. Поскольку элементы у меня типа 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 15.05.2006 22:44

Я еще раз повторяю про ТЕГИ !!!

Автор: volvo 16.05.2006 0:41

Ну, вот так тебя устроит? У тебя было много лишних действий, и даже лишняя процедура.

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 16.05.2006 17:26

Спасибо большое за помощь! smile.gif

Автор: Clon 17.05.2006 23:54

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

Автор: volvo 18.05.2006 2:36

Цитата(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 18.05.2006 21:28

Спасибо, я кажется понял, где ошибся. Вот еще такой вопрос: что значит "навигация по списку с помощью итераторов?"

Автор: volvo 18.05.2006 22:31

Итераторов? Ты с языком программирования не ошибся? Итераторы это в С++ smile.gif

Автор: Clon 18.05.2006 22:49

Дык мне тоже очень это интересно. В задании так и говорится - "Навигацию по списку следует реализовать с применением итераторов". Ну хорошо, а в C++ это что обозначает?

Автор: volvo 18.05.2006 23:00

http://ru.wikipedia.org/wiki/%D0%98%D1%82%D0%B5%D1%80%D0%B0%D1%82%D0%BE%D1%80