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