Задание: Вводится последовательность целых чисел(по одному). Используя список, найти среднее двух соседних чисел. Организовать новый список в котором расположить средние по неубыванию. Распечатать списки.
.
uses crt;
type
plist = ^tlist;
tlist = record
info: integer;
link: plist;
end;
var
first1, posl1 : plist;
procedure print(p: plist);
begin
while p <> nil do begin
write(p^.info:5);
p := p^.link
end;
writeln;
end;
procedure vvod (var first, last: plist);
var
s: integer;
p: plist;
begin
last := first;
repeat
write('Vvedite sled element: '); readln(s);
if s <> 25 then begin
new(p);
p^.info := s;
p^.link := nil;
if first = nil then first := p
else last^.link := p;
last := p;
end;
until s = 25;
end;
var
ii, jj, nmin: plist;
T: integer;
begin
clrscr;
writeln('Perviy spisok:');
first1:=nil; vvod (first1, posl1);
print(first1);
{ Sortirovka }
ii := first1;
while ii^.link <> nil do begin
nmin := ii;
jj := ii^.link;
while jj <> nil do begin
if jj^.info < nmin^.info then nmin := jj;
jj := jj^.link;
end;
T := ii^.info;
ii^.info := nmin^.info;
nmin^.info := T;
ii := ii^.link;
end;
writeln('Otsort spisok:');
print(first1);
end.
Ты зря сортировал ЭТОТ список...
Опиши процедуру Append, задачей которой будет добавлять переданное в нее значение типа Real в список... Потом проходи по исходному списку, и делай так:
...После заполнения списка средних его надо будет отсортировать...
p := firstl; { <--- начало твоего списка }
while (p <> nil) and (p^.link <> nil) do begin
append(new_list, (p^.info + p^.link^.info) / 2);
p := p^.link;
end;
...
...После заполнения списка средних его надо будет отсортировать...
p := firstl; { <--- начало твоего списка }
while (p <> nil) and (p^.link <> nil) do begin
append(new_list, (p^.info + p^.link^.info) / 2);
p := p^.link;
end;
...
type
pt = ^k;
k = record
i: real;
l: pt
end;
var
px, pk : pt;
-----------
Procedure append(var pk: pt; var r: real);
var
px : pt;
begin
new(px);
px^.l:=nil;
pk^.l:=px;
pk:=px;
pk^.i:=r;
end;
Procedure append(var pk: pt; var r: real);
uses crt;Не забудь удалить списки...
type
plist = ^tlist;
tlist = record
info: real; { <--- !!! }
link: plist;
end;
procedure append(var first, last: plist; value: real);
var p: plist;
begin
new(p);
p^.info := value; p^.link := nil;
if first = nil then first := p
else last^.link := p;
last := p;
end;
procedure print(p: plist; len: integer);
begin
while p <> nil do begin
write(p^.info:7:len);
p := p^.link
end;
writeln;
end;
procedure vvod(var first: plist);
var
s: integer;
p, last: plist;
begin
first := nil; last := nil;
repeat
write('Vvedite sled element: '); readln(s);
if s <> 25 then append(first, last, s);
until s = 25;
end;
var
first: plist;
p, first_2, last_2: plist;
ii, jj, nmin: plist;
T: real;
begin
clrscr;
writeln('Perviy spisok:');
vvod(first);
print(first, 0); { Печатаем целые числа, 0 знаков после запятой }
first_2 := nil; last_2 := nil;
p := first; { <--- íà÷àëî òâîåãî ñïèñêà }
while (p <> nil) and (p^.link <> nil) do begin
append(first_2, last_2, (p^.info + p^.link^.info) / 2);
p := p^.link;
end;
print(first_2, 2); { это - проверка, как средние заносятся в список }
{ Sortirovka }
ii := first_2;
while ii^.link <> nil do begin
nmin := ii;
jj := ii^.link;
while jj <> nil do begin
if jj^.info < nmin^.info then nmin := jj;
jj := jj^.link;
end;
T := ii^.info;
ii^.info := nmin^.info;
nmin^.info := T;
ii := ii^.link;
end;
writeln('Otsort spisok:');
print(first_2, 2); { Ну, и результат }
end.
Спасибо тебе огромное !
Сорри, можно у меня в коде показать, ГДЕ я что там "занулял"?
Или твой преподаватель хочет сказать, что надо работать с неинициализированными переменными-указателями на "голову"/"хвост" списка (это единственное место, где у меня в коде присутствует присвоение NIL)? Тогда пусть идет учит матчасть...
Просмотрев программу, он, позже, отметил:"Ошибка в процедуре append"
Добавлено через 7 мин.
Вообщем надо сделать просто так, чтобы чтение первого списка и запись его в другой проходило с хвоста (в текущем положении указателя) к голове.