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

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

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

> 2 одноаправленных списка, обратный порядок
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 3
Пол: Женский

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


Задача такая
Дано 2 однонаправленных списка целых чисел.
Надо в первый список после максимального элемента вставить 2ой список, но в обратном порядке(вот с этим то обратным порядком проблемы)
Надеюсь на помощь, всех с Наступающим =)


type
list=^elem;
elem=record
info:integer;
next:list;
end;

var l,p,q,l2,p2,q2,w:list; x,y,max:integer;


begin
writeln('Первый');
new(l);
readln(x);
l^.info:=x;
p:=l;
while x<>0 do
begin
new(q);
readln(x);
q^.info:=x;
p^.next:=q;
p:=q;
end;
p^.next:=nil;

writeln('Второй');
new(l2);
readln(y);
l2^.info:=y;
p2:=l2;
while y<>0 do
begin
new(q2);
readln(y);
q2^.info:=y;
p2^.next:=q2;
p2:=q2;
end;
p2^.next:=nil;


p:=l;
max:=p^.info;
while p^.next<>nil do
begin
if p^.info>max then max:=p^.info;
p:=p^.next;
end;



p:=l; p2:=l2;
while p^.next<>nil do
begin
if p^.info=max then
begin
new(q);


q^.info:=p2^.info;
q^.next:=p^.next;
p^.next:=q;

p2:=p2^.next;


while p2^.next<>nil do
begin
new(w);
w^.info:=p2^.info;
p^.next:=w;
w^.next:=q;
w:=q;
p2:=p2^.next;
end;

end;
p:=p^.next;
end;

p^.next:=nil;
writeln('Измененный') ;
p:=l;
while p^.next<>nil do
begin
writeln(p^.info);
p:=p^.next;
end;
end.


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


Гость






Я начну с небольшой критики.
Код очень трудно читать (отступы слишком хаотичны, пары begin/end на разных уровнях).
Переменные имеют нечитабельные имена.
Повторяющиеся операции (ввод списка, вывод списка на экран) лучше вынести в процедуры - тогда и переменных станет меньше.
Ошибка при вставке нового элемента в список.
"Хоть это и не педагогично" (цитата из к/ф "Завтрак на траве") мне легче привести прграммку

TYPE
List = ^Elem;
Elem = RECORD
Info : Integer;
Next : List;
END;

{заполнение списка случайными значениями}
PROCEDURE FillList(VAR Root : List);
VAR
i : Integer;
p : List;
BEGIN
New(Root);
Root^.Next:=NIL;
Root^.Info:=Random(100);
p:=Root;
for i:=1 to 10 do begin
New(p^.Next);
p:=p^.Next;
p^.Next:=NIL;
p^.Info:=Random(100);
end;
END;

{освобождение памяти от списка}
PROCEDURE ReleaseList (VAR Root : List);
VAR
p : List;
BEGIN
while Assigned(Root) do begin
p:=Root;
Root:=Root^.Next;
Dispose(p);
end;
END;

{вывод элементов списка на экран}
PROCEDURE ShowList ( Root : List);
BEGIN
while Assigned(Root) do begin
Write(Root^.Info:3);
Root:=Root^.Next;
end;
WriteLn;
END;

{возвращает указатель на максимальный элемент}
FUNCTION GetIndexMax( Root : List) : List;
VAR
Pmax : List;
BEGIN
Pmax:=Root;
while Assigned(Root) do begin
if Pmax^.Info<Root^.Info
then begin
Pmax:=Root;
end;
Root:=Root^.Next;
end;
GetIndexMax:=Pmax;
END;

{Indx - указатель на элемент списка,
за которым будет вставлен элемент со значением Info}
PROCEDURE InsertNode( VAR Indx : List;
Info : Integer
);
VAR
Node : List;
BEGIN
if Indx=NIL then Exit;
New(Node);
Node^.Info:=Info;
Node^.Next:=Indx^.Next;
Indx^.Next:=Node;
END;

VAR
Root1 : List; {начало списка 1}
Root2 : List; {начало списка 2}
Pmax : List; {указатель на максимальный элемент списка 1}
Indx : List; {указатель на текущий элемент в списке 2}
Node : List; {указатель на добавляемый элемент в список 1}
BEGIN
Root1:=NIL;
Root2:=NIL;
{заполнение списков случайными значениями}
Randomize;
FillList(Root1);
FillList(Root2);
{вывод списков на экран}
Write('List 1: ');
ShowList(Root1);
Write('List 2: ');
ShowList(Root2);
{получить указатель на максимальный элемент списка 1}
Pmax:=GetIndexMax(Root1);
{вставить элементы списка 2 в список 1 после максимального элемента}
Indx:=Root2;
while Assigned(Indx) do begin
InsertNode(Pmax, Indx^.Info);
Indx:=Indx^.Next;
end;
{вывод результата на экран}
WriteLn('Result');
Write('List 1: ');
ShowList(Root1);

ReleaseList(Root1);
ReleaseList(Root2);
END.
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





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