Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Удаление элемента с начала списка

Автор: dream-x 10.06.2008 14:33

Здравствуйте!
Составить процедуру, определяющуювхождение списка L1 в список L2 и наоборот. Если один из списков длиннее, удалить лишние элементы из его начала. Используя процедуру, проанализировать пары списков М1 и М2, N1 и N2.

 
Program Spisok;
Uses CRT;
Type
TData=integer;
PLink=^TElement;
TElement=Record
Data:TData;
Link:PLink;
End;

Procedure InPutList(n: integer; Var List:PLink);
Var
ElNew:PLink;
Value:TData;
i:Integer;
Begin

{ List:=NIL;}
For I:=1 To n Do
Begin
WriteLn('vvedite ',i,' element');
Read(value);
New(ElNew);
ElNew^.Data:=Value;
ElNew^.Link:=List;
List:=ElNew;


End;
End;
{----------------}
Procedure OutPutList(List:PLink);
Var
i:integer;
Begin
WriteLn('element spiska ');
While List <> NIL Do
Begin
Write(List^.Data,' ');
List:=List^.Link;
End;
WriteLn;
End;
{----------------}

Var
List1,List2,Elem,NewElem:PLink;
o,i,n,p,m:Integer;
ff:boolean;


Begin
ClrScr;
WriteLn('vvedite kol-vo elementov spiska ');
ReadLn(n);
WriteLn('vvedite kol-vo elementov spiska ');
ReadLn(m);

InPutList(n,List1);
InPutList(m,List2);
Writeln;
OutPutList(List1);
Writeln;
OutPutList(List2);
i:= 0;

While List1 <> nil do
Begin
If List1^.Data <> List2^.Data then
Begin
Writeln('ne vhodit 1 v 2');
ff:= True;
break
End;
List1:= List1^.Link;
List2:= List2^.Link;
End;

While List2 <> nil do
Begin
If List2^.Data <> List1^.Data then
Begin
Writeln('ne vhodit 2 v 1');
ff:= False;
break
End;
List1:= List1^.Link;
List2:= List2^.Link;
End;

If m > n Then o:= m-n else o:= n-m;

{ вот с этого момента я не могу понять
в чем моя ошибка}


New(NewElem);
If ff = True Then
for i:= 1 to o do
Begin
List1:= NewElem;
NewElem:= NewElem^.Link;
Dispose(NewElem);
end;
writeln('@@');
Outputlist(List1);
keypressed;
End.

Автор: compiler 10.06.2008 17:54

В общем, я вот накидал нужные процедурки, смотри, тестируй, разбирайся, задавай вопросы..

function IsIn(l, s : PLink):boolean;
{ l in s = ? }
function IsInBeg(l, s : PLink):boolean;
var
b : boolean;
begin
b := true;
while (l <> nil) and (s<>nil) and b do begin
If l^.Data <> s^.Data then b:=false;
l:= l^.Link;
s:= s^.Link;
end;
isinbeg:= b and s=nil;
end; { IsInBeg }
var
b : boolean;
begin
b := false;
if s<>nil then
while (l <> nil) and (not b) do begin
If l^.data = s^.data then b:=isinbeg(l^.link, s^.link);
(*if not b do*)
l:= l^.link;
end;
end; { IsIn }

procedure delf(var l : PLink; const n : integer);
procedure delfirst(var l : PLink);
var p_old : PLink;
begin
p_old:=l;
l:=l^.link;
dispose(p_old);
end; { delfirst }
var i : integer;
begin
for i:=1 to n do
(*if l<>nil then*)
delfirst(l);
end; { delf }

и про освобождение памяти не забудь..