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


Гость






Идея вставки следующая.
Нахоодим указатель на максимальный элемент списка 1.
Начинаем просматривать от начала список 2.
Каждый элемент из списка 2 вставляем в список 1 после максимального элемента.

Таким образом, по завершению просмотра списка 2 после максимального элемента будет находится последний элемент списка 2, потом предпоследний и т.д.

Это всё верно, если тоько не требовалось объединить оба списка в один. Но в этом случае всё почти тоже самое, но изменится процедура вставки и будет удалена строка вызова процедуры освобождения памяти от списка 2.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Да что ж такое-то? Кто придумывает эти однотипные тупые задания? Кто постоянно штампует однотипные тупые решения??? Сколько раз можно задавать вопрос (задавал неоднократно, но почему-то ВСЕГДА он остается без ответа) : почему, собственно, разделяется первый элемент списка и все последующие? Что такого особенного есть в первом, что для его инициализации надо продублировать минимум три строки кода? Если уж первый элемент настолько примечателен, то куда его примечательность девается при выводе списка? Почему отдельно не печатается первый элемент, а потом - циклом все остальные? Это теперь так принято, программу сдавать "чем больше строк - тем она лучше"? Ошибки исправлять в подобной программе труднее ровно в 2 раза, если что.

P.S. Жду уточнения топикстартера каким образом происходит "вставка". Вставляется перевернутая копия списка_2? Сам список_2 в развернутом виде? В любом случае я бы не стал вставлять по одному элементу в одно и то же место первого списка. Гораздо проще (и правильней) будет "развернуть" второй, и одним действием поменять 2 указателя...

P.S. Я с гостями не общаюсь, если что, так что вопросы !!FPA!! может не задавать, я вопросы от гостей просто игнорирую. Будьте добры представиться, когда входите куда-то, а не сразу с порога начинать заявлять тут, что педагогично, а что - нет, скрываясь за пустой безликой маской "гость".
 К началу страницы 
+ Ответить 

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

 





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