Паскаль - список двойных ссылок
Я пытаюсь скомпилировать двусвязный список, но у меня есть одна небольшая проблема с этой частью кода:
Это "вставить после"
Когда я вставляю данные в список: 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;