uses crt;
{пользовательский тип}
type
isType=^isList;
isList=record
x,y:integer;
z:isType;
end;
{преременные основной программы}
var
a:isType;
{вывод одного элемента}
procedure showOne(x,y:integer);
begin
write(x);{}
if y<>0 then write('*X^',y);{}
end;
{сортируем по убыванию степеней}
procedure sortPolinom(var c:isType);
var
d,e:isType;
begin
d:=c;
while d^.z<>nil do
begin
while (d^.y>d^.z^.y)and(d^.z<>nil)do d:=d^.z;
if d^.z<>nil then
begin
e:=d^.z;
d^.z:=d^.z^.z;
e^.z:=c;
c:=e;
d:=c;
end;
end;
end;
{вводим полином}
procedure inputPolinom(var c:isType);
var
d:isType;
e,f:integer;
begin
c:=nil;
writeln('Вводите коэффициенты и степени, целые числа, окончание 2 ноля');
repeat
write('коэффициент:');{показатель и степень}
readln(e);
write('степень:');
readln(f);
if(e=0)and(f=0)then break;
{ищем в списке введенную степень}
d:=c;
while (d^.y<>f)and(d<>nil) do d:=d^.z;
if d=nil then
begin{нет, содаем элемент и включаем его в список}
new(d);
d^.x:=e;
d^.y:=f;
d^.z:=c;
c:=d;
end else inc(d^.x,e);
until false;
sortPolinom(c);
end;
{освобождаем занимаемую память}
procedure freePolinom(var c:isType);
var
d:isType;
begin
while c<>nil do
begin
d:=c;
c:=c^.z;
dispose(d);{освобождаем}
end;
end;
{выводим полином на экран}
procedure showPolinom(c:isType);
begin
clrscr;
while c<>nil do{пока не выведем весь список}
begin
showOne(c^.x,c^.y);
c:=c^.z;{следующий элемент}
if c<>nil then write(' + ');{если не достигли предела выводим знак}
end;
writeln;
end;
begin
clrscr;
{вводим полином}
inputPolinom(a);
{выводим полином}
showPolinom(a);
{освобождаем память}
freePolinom(a);
readln;
end.