1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Вот я составил прогу, основываясь на материалах с этого форума по спискам. Вот только в эти две процедуры мне надо переделать так, чтобы они добавляли элементы перед и после ЛЮБОГО элемента из списка соответственно, а не только в начало и в конец. Помогите, если не трудно
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 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;
Вот программа. Кстати, сейчас еще думаю над удалением произвольного элемента. Поскольку элементы у меня типа 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.
Ну, вот так тебя устроит? У тебя было много лишних действий, и даже лишняя процедура.
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.
Пытался вчера сделать удаление для любого элемента из списка, но что-то фигня какая-то выходит. Почему-то постоянно стирает как и нужный элемент и все те, что после него.
Дык мне тоже очень это интересно. В задании так и говорится - "Навигацию по списку следует реализовать с применением итераторов". Ну хорошо, а в C++ это что обозначает?