Форум «Всё о Паскале» _ Задачи _ Однонаправленные списки.
Автор: NTL 10.04.2007 4:58
Задача.В слове, состоящем из букв и цифр и заканчивающемся точкой, продублировать каждый нецифровой символ. Помогите с процедурой Finish, хотя ошибка вознкает в Insert_before.
Код
uses crt; Type point = ^MyWord; MyWord = record ch: char; next: point end; var digits: set of ord('0')..ord('9'); slovo:point; c:char; i:integer; {---------------------------------------------------------------------------} procedure Print (first: point); Var r: point; begin R:= first; While r<>nil do begin Write (r^.ch); R:=r^.Next end; writeln end; {---------------------------------------------------------------------------} procedure Vvod(var first:point); var r, last:point; begin first:= nil; last := nil;
writeln('HA6EPuTE C/\OBO C "." HA KOHCE '); while r^.ch <> '.' do begin new(r); r^.next := nil; read(r^.ch);
if first = nil then first := r else last^.next := r;
last := r end end; {----------------------------------------------------------------------------} Procedure insert_before (Var q: point; x: char); Var r: point; Begin New(r); r^.Next:=q^.Next; q^.Next:=r; r^.ch:=q^.ch; q^.ch:=x end; {----------------------------------------------------------------------------} Procedure Finish(first:point); var r,temp:point;
begin r := first; repeat case r^.ch of 'a'..'z', 'A'..'Z':insert_before(r,r^.ch); else r:=r^.next; end; until r = nil end;
Ты так думаешь? Ошибка у тебя возникает еще при вводе слова, ПЕРЕД вводом первого символа, потому что вот тут:
procedure Vvod(var first:point); var r, last:point; begin first:= nil; last := nil;
writeln('HA6EPuTE C/\OBO C "." HA KOHCE '); while r^.ch <> '.' do { <--- Именно в этом месте !!! } ...
вероятнее всего произойдет переход по nil-овому указателю...
Автор: NTL 10.04.2007 18:14
Вроде испрвил, но все равно выдает ошибку:"Heap overflow error" и курсор переходит на строчку
Код
Procedure insert_before (Var q: point; x: char); Var r: point; Begin New(r);{здесь ошибка Heap overflow error}
-----------------------
Код
procedure Vvod(var first:point);{исправленный вариант ввода} var r, last:point; begin first:= nil; last := nil;
writeln('HABEPuTE C/\OBO C "." HA KOHCE '); repeat new( r ); r^.next := nil; read(r^.ch);
if first = nil then first := r else last^.next := r;
last := r; until r^.ch = '.';
end;
Автор: NTL 10.04.2007 18:58
Что-то мне подсказывает, что у меня неправильный вызов процедуры Insert_before
Автор: NTL 10.04.2007 20:02
Сам решил проблему
Код
Procedure Finish(first:point); var r,temp:point; begin r := first; repeat temp:=r; case r^.ch of 'a'..'z','A'..'Z': begin insert(r,r^.ch); r:=r^.next^.next end; else r:=r^.next; end; until r = nil; end;