Вот я составил прогу, основываясь на материалах с этого форума по спискам. Вот только в эти две процедуры мне надо переделать так, чтобы они добавляли элементы перед и после ЛЮБОГО элемента из списка соответственно, а не только в начало и в конец. Помогите, если не трудно
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 18: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 18: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 18:44
Я еще раз повторяю про ТЕГИ !!!
volvo
15.05.2006 20: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 13:26
Спасибо большое за помощь!
Clon
17.05.2006 19:54
Пытался вчера сделать удаление для любого элемента из списка, но что-то фигня какая-то выходит. Почему-то постоянно стирает как и нужный элемент и все те, что после него.
volvo
17.05.2006 22:36
Цитата(Clon @ 17.05.2006 19:54)
Пытался вчера сделать удаление для любого элемента из списка, но что-то фигня какая-то выходит.
У меня вот что вышло:
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 17:28
Спасибо, я кажется понял, где ошибся. Вот еще такой вопрос: что значит "навигация по списку с помощью итераторов?"
volvo
18.05.2006 18:31
Итераторов? Ты с языком программирования не ошибся? Итераторы это в С++
Clon
18.05.2006 18:49
Дык мне тоже очень это интересно. В задании так и говорится - "Навигацию по списку следует реализовать с применением итераторов". Ну хорошо, а в C++ это что обозначает?