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

> 

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> простая задача на списки, fp
сообщение
Сообщение #1


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Добрый день!
Надо довести до совершенство решение задачи, тема который для меня тёмный лес:
Написать программу, содержащую процедуру, которая меняет местами первый
и второй элементы не пустого списка.
Если элементы не найдены, то выдать на экран соответствующие сообщение.

задача уже решалась на форуме, однако хотелось бы увидеть оптимальное решение, учитывая возможности FP
моё решение
{$mode objfpc}
type
data=^node;
node=record i:integer; next:data; end;

function ch(var p:data):boolean;
var wp:data;
begin
if p^.next<>nil then begin
wp:=p^.next; p^.next:=wp^.next; wp^.next := p;
p:=wp;
ch:=true;
end else
ch:=false;
end;

procedure print(const p:data);
var p0:data;
begin
p0:=p;
if (p0^.next<>nil) then begin
repeat
writeln(p0^.i); p0:=p0^.next;
until (p0^.next=nil);
writeln(p0^.i);
end;
end;

procedure init(var p:data);
var p0,p1:data; i:integer;
begin
new(p);
p^.next:=nil; p^.i:=0;
p0:=p;
readln(i);
if i<>0 then begin
p0^.i:=i;
readln(i);
while i<>0 do begin
new(p1);
p1^.i:=i; p1^.next:=nil;
p0^.next:=p1;
p0:=p1;
readln(i);
end;
end;
end;

procedure free(p:data);
var p0:data;
begin
repeat
p0:=p^.next;
dispose(p);
p:=p0;
until (p=nil);
end;

var
sp:data;
begin
init(sp);
if ch(sp) then print(sp) else writeln('error');
free(sp);
end.
заранее благодарен.


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






compiler, давай переменным "говорящие" имена. Иначе ты сам себя путаешь. Смотри, насколько все проще:
function replace1a5(var p:data):boolean;
var
p_4, p_5, p_6: data;
i: integer;
begin
result:=true;

p_4 := p; // Будем искать указатель на 4-ый элемент списка ...
i := 1;
while (i < 4) and result do
if p_4^.next = nil then result := false
else begin
inc(i); p_4 := p_4^.next;
end;

if result then begin
// если мы здесь - то список содержит как минимум 4 элемента,
// и p_4 как раз указывает на 4-ый

// Значит, запоминаем пятый
p_5 := p_4^.next;

// и если пятый - ненулевой, то запоминаем шестой
if p_5 <> nil then
p_6 := p_5^.next
else begin
// иначе - ошибка, пятый - нулевой, нечего менять
result := false; exit;
end;

// собственно, сами замены - тут все прозрачно, разберешься я думаю...
p_4^.next := p;
p_5^.next := p^.next;
p^.next := p_6;
p := p_5;
end;

end;

Чертишь на листочке бумаги список, связи между элементами, и смотришь, что с чем надо поменять чтобы новый порядок элементов в списке был таким, какой тебе нужен...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


Цитата(volvo @ 26.01.2008 22:57) *

compiler, давай переменным "говорящие" имена. Иначе ты сам себя путаешь.
пытаюсь, но....
Цитата(volvo @ 26.01.2008 22:57) *
Смотри, насколько все проще...
да... твой код читается как повесть:)
Цитата(volvo @ 26.01.2008 22:57) *
Чертишь на листочке бумаги список, связи между элементами, и смотришь, что с чем надо поменять чтобы новый порядок элементов в списке был таким, какой тебе нужен...
весь стол уже закидан черновиками(из них два листика со списками))


Спасибо!


--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Человек
*****

Группа: Пользователи
Сообщений: 1 050
Пол: Мужской
Реальное имя: Станислав

Репутация: -  3  +


А вот ищё одна задача....
6. Написать программу, содержащую процедуру, которая вставляет новый элемент перед каждым вхождением заданного элемента. Если элементы не найдены, то выдать на экран соответствующие сообщение.
моё решение..
function pastbef(var p_b:data; const i_p, i_s:integer):boolean;
var
p_old, p_new, p:data;
begin
p:=p_b;
result:=false;
p_old:=nil;
while p<>nil do begin
if p^.i=i_s then begin
result:=true;
new(p_new);
p_new^.next:=p;
p_new^.i:=i_p;
if p_old=nil then p_b:=p_new
else p_old^.next:=p_new;
end;
p_old:=p;
p:=p^.next;
end;
end;
но уж больно оно мне не нравится, может, можно решить лучше?



--------------------
Спасибо!
Удачи!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
compiler   простая задача на списки   26.01.2008 2:26
volvo   Можно предложить тебе список в виде Generic-объект…   26.01.2008 2:52
compiler   Можно предложить тебе список в виде Generic-объек…   26.01.2008 3:16
volvo   В таком случае (для "разобраться") - чем…   26.01.2008 6:02
compiler   В таком случае (для "разобраться") - чем…   26.01.2008 17:13
volvo   Комментарии добавлены... А насчет Если тебе на…   26.01.2008 17:37
compiler   Комментарии добавлены... теперь, вроде, разобрался…   26.01.2008 18:00
volvo   Менять надо не ее, а функцию Ch: // сначала пров…   26.01.2008 18:05
compiler   Менять надо не ее, а функцию Ch:огромное спасибо…   26.01.2008 19:10
compiler   я тут ещё одну процедурку пытаюсь реализовать(меня…   27.01.2008 3:31
volvo   compiler, давай переменным "говорящие" и…   27.01.2008 3:57
compiler   [b]compiler, давай переменным "говорящие…   27.01.2008 4:13
compiler   А вот ищё одна задача.... 6. Написать программу, с…   30.01.2008 1:29
volvo   Чем, можно узнать? Смотри, тут уже такое дело: са…   30.01.2008 2:03
compiler   Чем, можно узнать?не знаю.. много переменных(что-…   30.01.2008 2:19
Yevgeny   Извините, а можно поинтересоваться зачем нужно в н…   30.01.2008 2:14
volvo   Это с чего вдруг? По умолчанию как раз используетс…   30.01.2008 3:06
compiler   ...там есть ключ -Mfpc...хм.. действительно есть..…   30.01.2008 3:30


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

 





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