про while not eof do - утверждать ничего не буду, хотя на мой взгляд мне кажется синтаксис неправильным. Для начала разберись со строками:
Код:
...
q:=b;
while (q<>b) or (x<q^.d) do
...
1) ты не попадаешь в цикл из-за (q<>b), так как на первой итерации цикла и q и b равны nil;
2) так как на первой итерации цикла q = b (nil), то q^.d - вероятнее всего возвращает ошибку.