Помощь - Поиск - Пользователи - Календарь
Полная версия: список
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Гость
Добрый вечер(или че там у Вас))!
Есть задания по спискам, в которых я пока не разбираюсь. помогите пожалуйста
задание
Написать программу, содержащую процедуру, которая меняет местами первый
и второй элементы непустого списка.
Если элементы не найдены, то выдать на экран соответствующие сообщение.}
мой вариант решения
type
data= ^node;
node = record
digital: integer;
next: data;
end;

function init(r: data):pointer;
{заглушка, как я понял список формируется с конца(?)}
var n:integer;
begin
init:= nil; {начало с пустого списка}
read(n);
While n<>0 do begin
New®;
r^.Next:=init;
r^.digital:=n;
init:=r;
read(n);
end;
end;

procedure free(var sp: data);
begin
while (sp<>nil) do begin
dispose(sp);
end;
end;

procedure print(p:data);
var sp:data;
begin
sp:=p;
while (sp<>nil) do begin
writeln(sp^.digital);
sp:=sp^.next;
end;
end;

procedure replase(var p1, p2: pointer);
{можна ли тут использовать классический вариант без использования дополнительной переменной?}
var p:pointer;
begin
p:=p1;
p1:=p2;
p2:=p;
end;

procedure replaseFirstAndSecond(var sp: data);
begin
replase(sp, sp^.next);
end;

var
spisok: data;{может тут можна обойтись одной переменной?}
head: data;
begin
head:=init(spisok);{создаем список, head указывает на первый элемент}
replaseFirstAndSecond(head);{меняем местами}
print(head);{печать}
free(head);{освобождение памяти}
end.

вотс...
Гость
модернизация smile.gif
procedure free(var sp: data);
var
sp0: data;
begin
while (sp<>nil) do begin
sp0:=sp;
dispose(sp);
sp:=sp0;
end;
end;


зы
подразумеваю ошибку в replaseFirstAndSecond или в replase... возможно в передаче между функциями...
Гость
up
volvo
Правильно подразумеваешь... Проще программу надо делать:

procedure replaseFirstAndSecond(var sp: data);
var p: data;
begin
p := sp^.next;
sp^.next := p^.next;
p^.next := sp;

sp := p;
end;

С процедурой Replase не заморачивайся, тут не простой, а более хитрый обмен значениями...

Кроме всего прочего, у тебя с инициализацией (я про Init) проблемы не возникли? Возникнут... Потому что в
r^.Next:=init;
компилятор видит не что иное, как рекурсию... А значит, неверное число параметров... Перепиши вот так:

function init(r: data):data;
var
n: integer;
p: data;
begin
p := nil;
read(n);
While n<>0 do begin
New®;
r^.next := p;
r^.digital:=n;
p := r;
read(n);
end;
init := p;
end;

Ну, и последнее (это уже исправляй сам) - у тебя утечка памяти при удалении списка. Free неработоспособна в таком виде...
Гость
спасибо...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.