線形リストはレコードの追加、削除ができますが
その場合でも常に全体を参照できる様、
例えば先頭にレコードを追加する場合は
変更後の先頭のレコードをさすようにポインタを変更します。
先頭のレコードを削除する場合は
次のレコードをさすようにポインタの値を変更します。

ところでプログラム中の4行目のp:=S1↑.next; は
もしかしたら p := S1 ではないのかと。
S1の一番はじめのレコードが無視されているような気がします。