IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> список, поменять элементы местами
сообщение
Сообщение #1


Гость






Добрый вечер(или че там у Вас))!
Есть задания по спискам, в которых я пока не разбираюсь. помогите пожалуйста
задание
Написать программу, содержащую процедуру, которая меняет местами первый
и второй элементы непустого списка.
Если элементы не найдены, то выдать на экран соответствующие сообщение.}
мой вариант решения
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.

вотс...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






модернизация 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... возможно в передаче между функциями...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






up
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Правильно подразумеваешь... Проще программу надо делать:

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 неработоспособна в таком виде...

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






спасибо...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 5.12.2020 16:33
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name