Вот я составил прогу, основываясь на материалах с этого форума по спискам. Вот только в эти две процедуры мне надо переделать так, чтобы они добавляли элементы перед и после ЛЮБОГО элемента из списка соответственно, а не только в начало и в конец. Помогите, если не трудно
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);{Добавление элемента в конец списка}beginwhile L^.Next<>nildo 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:=nilend;
Тегами пользуемся...
volvo
15.05.2006 22:38
Как будешь указывать, перед или после КАКОГО элемента надо добавить новый? Указатель на элемент, или значение?
Если указатель на элемент, то примерно вот так (было выдрано из ООП-реализации, так что здесь может глючить... Приведи свою программу полностью для того, чтобы ее можно было проверить...):
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);
beginwhile L^.Next <> nildo L := L^.Next;
new(L^.Next);
L:=L^.Next;
L^.Info := E;
L^.Next := nilend;
procedure InsertAfter(L: TList; X: Integer; E: TElem);
Var N: TList;
beginwhile (L^.next <> nil) and (X > 1) dobegin
L := L^.next; Dec(X)
end;
if X = 1thenbegin
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:=nilEnd;
procedure Active(var L: TList);
var
H: TList;
P: TList;
begin
P := nil;
while L<>nildobegin
H := L^.Next;
L^.Next := P;
P := L;
L:=H
end;
L :=P
end;
procedure Print(L: TList );
begin
write('< ');
while L <> nilDObegin
write( L^.Info );
If L^.Next <> nilthen 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 of1, 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 = 1then Insert(L, get_boolean)
else InsertAfter(L, X - 1, get_boolean);
end;
end;
until z = 8;
end.
Clon
16.05.2006 17:26
Спасибо большое за помощь!
Clon
17.05.2006 23:54
Пытался вчера сделать удаление для любого элемента из списка, но что-то фигня какая-то выходит. Почему-то постоянно стирает как и нужный элемент и все те, что после него.
volvo
18.05.2006 2:36
Цитата(Clon @ 17.05.2006 19:54)
Пытался вчера сделать удаление для любого элемента из списка, но что-то фигня какая-то выходит.
У меня вот что вышло:
Procedure DelAfter(Var L: Tlist; X: integer);
Var
T, r: Tlist;
Beginif X = 0thenbegin
T := L;
L := L^.next;
dispose(T);
endelsebegin
r := L;
while (r^.next <> nil) and (X > 1) dobegin
r := r^.next; Dec(X)
end;
if X = 1thenbegin
T := r^.next;
if T <> nilthen 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
Итераторов? Ты с языком программирования не ошибся? Итераторы это в С++
Clon
18.05.2006 22:49
Дык мне тоже очень это интересно. В задании так и говорится - "Навигацию по списку следует реализовать с применением итераторов". Ну хорошо, а в C++ это что обозначает?