Паскаль - список двойных ссылок

Я пытаюсь скомпилировать двусвязный список, но у меня есть одна небольшая проблема с этой частью кода:

Это "вставить после"

Когда я вставляю данные в список: 1 2 3 4 5 и хочу вставить после номера 4, например, номера 9, номер 9 вставляется так: 1 9 2 3 4 5. Я действительно не знаю, где у меня неправильный код:(

каждый раз я вставляю новый номер на вторую позицию..

procedure insertAfter(var L:Plist; n_p:integer);
var novy_za:Plist;

  begin
    new(novy_za);
    novy_za^.info:=n_p;
    novy_za^.next:=L^.next;
    novy_za^.prev:=L;
    L^.next:=novy_za;
      if novy_za^.next<>nil
      then novy_za^.next^.prev:=novy_za;
 end;

вызов процедуры:

  begin
   writeln;
   write('which number insert  : '); readln(x);
   writeln;
   write('insert after  : '); readln(Y);
   InsertAfter(P,x);
  end;  

1 ответ

Решение

Вот исправленная версия вашей рутины. Ваш оригинал не смог принять значение, которое вы хотите вставить в качестве аргумента. Я сделал это функцией, чтобы она возвращала указатель на новый добавленный элемент, если он смог найти тот, который вы хотели вставить после. Иначе возвращается nil, Вы вызываете его со вторым аргументом, который сообщает, какое значение вы хотите вставить после.

function insertAfter(var L: Plist; n_a, n_p: integer): Plist;
var novy_za, cur_za: Plist;
begin
  cur_za := L;
  novy_za := nil;

  { Traverse the list, looking for value n_a and, if found, insert the new
    element n_p after it }

  while cur_za <> nil do begin
    { Insert the new element after the one with value n_a }

    if cur_za^.info = n_a then begin
      new(novy_za);
      novy_za^.info := n_p;
      novy_za^.next := cur_za^.next;
      novy_za^.prev := cur_za;
      cur_za^.next := novy_za;

      if novy_za^.next <> nil then
        novy_za^.next^.prev := novy_za;
      break;       { Exit the loop }
    end;

    cur_za := cur_za^.next;
  end;

  insertAfter := novy_za;
end;

Вызов функции (это предполагает P определяется где-то как действительный Plist, а также x а также y определяются как info тип):

begin
  writeln;
  write('which number insert  : '); readln(x);
  writeln;
  write('insert after  : '); readln(y);

  { Insert the value x after the number y }

  if insertAfter(P, y, x) = nil then
    writeln('The value ', y, ' was not found')
  else
    writeln('The value ', x, ' was successfully inserted after ', y);
end;  
Другие вопросы по тегам