1 Востаннє редагувалося Torbins (19.12.2012 20:48:21)

Тема: двонаправлений список

Добрий вечір.

Умова задачі: сформувати двонаправлений список із ланкою заголовком. Вставити перед кожною літерою "А" літеру "D".

Допоможіть знайти помилку, тому що після запуску програми вибиває помилку: "попитка разименовать нулевой указатель".

program lab13;
type
  zv2 = ^point2;

  point2 = record
    elem: char;
    next: zv2;
    priv: zv2
  end;

var
  vlan, vslov: zv2;
  sym: char;

  procedure vstav(lanka: zv2; buk: char);
  var
    q: zv2;
  begin
    new(q);
    q^.elem := buk;
    q^.next := lanka^.next;
    q^.priv := lanka^.next^.priv;
    lanka^.next^.priv := q;
    lanka^.next := q
  end;

begin
  writeln('vv symbols ');
  new(vslov);
  vslov^.next := vslov;
  vslov^.priv := vslov;
  repeat
    read(sym);
    vstav(vlan^.priv, sym);
  until sym = '.';

  vlan := vslov^.next;
  while vlan <> vslov do
  begin
    vlan := vslov;
    if vlan^.elem = 'A' then
      vstav(vlan^.priv, 'D');
    vlan := vlan^.next;
  end;

  writeln('result');
  vlan := vlan^.next;
  writeln;
  while vlan <> vslov do
  begin
    write(vlan^.elem);
    vlan := vlan^.next
  end;
  writeln;
end.

2

Re: двонаправлений список

А налагоджувач не вказує вам на рядок із помилкою?
Якщо вказує, то мабуть на рядок із викликом функції vstav після читання чергового символу. Ви ж передаєте у цю функцію вказівник vlan, який вказує у пустоту.

P.S. Дозволив собі скористатися своїми модераторськими правами та відформатував код у вашому повідомленні до читабельного вигляду.

Подякували: Replace1