Помощь - Поиск - Пользователи - Календарь
Полная версия: Линейные списки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Xrymz
читал я фак... немного понял.. но не все...
задание...
дано два линейных списка, А1 и А2, сделать подпрограмму которая будет в конец списка А1 кидать все элементы списка А2.

накалякал я такое


program pmf;
uses crt;
type
TEl = ^El;
El = record
i: integer;
next: TEl;
end;

var
A1,A2,A3: TEl;
i1,i2,j: integer;

begin
clrscr;

Randomize;
i1:= Random(10);
writeln('Dlina spiska A1 - ', i1);
for j:=1 to i1 do  {3a/7oJIHaem A1}
begin
A1^.i:=random(10)-10;
write(A1^.i,' ');
end;
writeln;
i2:=random(10);
writeln('Dlina spiska A2 - ', i2);

for j:=1 to i2 do  {3a/7oJIHaem A2}
begin
A2^.i:=random(10);
write(A2^.i,' ');
end;

writeln;


Readln;
end.



а как функцию правельно сделать незнаю((
Renbo
Цитата(Xrymz @ 14.05.2007 20:55) *

читал я фак... немного понял.. но не все...
задание...
дано два линейных списка, А1 и А2, сделать подпрограмму которая будет в конец списка А1 кидать все элементы списка А2.


Как я понял твоё задание, то просто берёшь и в последнем элементе А1 делаешь ссылку не на NIL, а на первый элемент А2...
Xrymz
хм.. а можно поподробнее? =)
Renbo
Цитата(Xrymz @ 14.05.2007 21:28) *

хм.. а можно поподробнее? =)



Ты кстати кажется списки не так вообще формируешь )

Вощем к делу:
Каждый список имеет такую штуку FIRST(указатель на первый элемент). Вот тебе надо в последнем элементе списка А1 в поле с указателем на NIL(т.к. он последний) занести указатель FIRST2(указатель на первый элемент списка А). Тем самым ты установишь связь между А1 и А2, тоесть А2 будет идти следом за А1, что тебе и требуется как ты говоришь )
Xrymz
чето я нихега немогу с этими списками...
ребята помоги плиз... задание вроде несложное...
если нетяжело сделайте... я хоть факю прочитал но списки понять немогу...
Renbo
Так вставляется новый элемент в конец списка:


USES CRT;
  TYPE
  
  EL=^ZAP;
  ZAP=Record
    INF1:integer;
    INF2:string;
    Next:EL;
  END;


VAR
  First, P, Q, T: EL;


Procedure Create_new_element (Var P:EL);
Var
  s:string;
  a,b:integer;
Begin
  clrscr;
  NEW(P);
  writeln('Введите табельный номер:');
  readln(p^.INF1);
  writeln('Введите фамилию сотрудника:');
  readln(p^.INF2);
  p^.Next:=NIL;
End;


procedure Insert_end_list(P:EL; VAR First:EL);
Begin
  IF First=NIL then
    First:=p
  ELSE
    begin
      Q:=First;
      While Q^.NEXT<>NIL do
        Q:=Q^.NEXT;
      Q^.NEXT:=p;
      p^.NEXT:=NIL;
    end;
End;


procedure Insert_begin_list(P:EL; VAR First:EL);
Begin
  IF First=NIL then
    begin
      First:=p;
      p^.Next:=NIL;
    end
  ELSE
    begin
      p^.Next:=First;
      First:=p;
    end;
End;

begin
  Create_new_element(p);
  Insert_begin_list(p,First);
end;



Так ты формируешь 2 списка, потом делаешь, что я расписал выше, а потом вывод на экран
volvo
Renbo, то есть, ты хочешь сказать, что для того, чтобы добавить один элемент в конец списка длины N, я должен произвести (N - 1) операцию присваивания, и столько же - сравнения вместо того, чтобы элементарно увеличить размер программы на 4 (ЧЕТЫРЕ) байта, и этого избежать ???
Renbo
я написал просто пример, с целью просто продемонстрировать. Короче или длиннее - это на его усмотрение, главное понять суть
Xrymz
люди некто неможет сделать мне задание... то не в какую немогу понять эти линейные списки... wacko.gif blink.gif
буду очень благодарен...
Гость
Люди гляньте плиз где тут лажа...
вот я тут сделал немного
program omfg;
uses crt;
type
  plist = ^list;
  list = record
    inf: integer;
    next: plist;
  end;

var beg,t,p1,p2,p3,first:plist;
n,i:integer;


begin
clrscr;
readln(n);
randomize;
new(first);{Sozdaem 1i sposik}
first^.next:=nil;
first^.inf:=random(10)-1;
for i:=1 to n-1 do
 begin
   new(p1);
   p1^.inf:=random(10)-1;
   p1^.next:=nil;
   p1^.next:=first;
   first:=p1;
 end;

t:=p1;

while t<>nil do
  begin
    write(t^.inf,' ');
    t:=t^.next;
  end;
writeln;

new(first);{Sozdaem 2i spisok}
first^.next:=nil;
first^.inf:=random(10)-1;
for i:=1 to n-1 do
 begin
   new(p2);
   p2^.inf:=random(10)-1;
   p2^.next:=nil;
   p2^.next:=first;
   first:=p2;
 end;

t:=p2;
while t<>nil do
  begin
    write(t^.inf,' ');
    t:=t^.next;
  end;

p1^.next:=p2;

writeln;
t:=p1;
while t<>nil do
  begin
    write(t^.inf,' ');
    t:=t^.next;
  end;

readln;
  end.


но у меня выводит
Код
3  {- ввожу
1 -1 8   {- список А1
0 -1 5   {- список А2
1 0 -1 5  {- то что у меня выходит.. тут ошибка

то есть он берет первый элемент списка А1 и вставляется за ним список А2... как исправить?




Xrymz
как исправить чтобы в конец списка А1 кидать все элементы списка А2.
предыдущие сообщение мое...
volvo
Ты все-таки не стал заводить указатель на "хвост" списка? Ну, как знаешь...
После распечатки двух списков делай так:

// вместо:
// p1^.next:=p2;
// пишешь:
t := p1;
while (t <> nil) and (t^.next <> nil) do
t := t^.next;
t^.next := p2;


и потом печатай первый список...
Xrymz
program omfg;
uses crt;
type
  plist = ^list;
  list = record
    inf: integer;
    next: plist;
  end;

var beg,t,p1,p2,p3,first:plist;
n,i:integer;


begin
clrscr;
readln(n);
randomize;
new(first);{Sozdaem 1i sposik}
first^.next:=nil;
first^.inf:=random(10)-1;
for i:=1 to n-1 do
 begin
   new(p1);
   p1^.inf:=random(10)-1;
   p1^.next:=nil;
   p1^.next:=first;
   beg:=p1;
 end;

t:=p1;

while t<>nil do
  begin
    write(t^.inf,' ');
    t:=t^.next;
  end;
writeln;

new(first);{Sozdaem 2i spisok}
first^.next:=nil;
first^.inf:=random(10)-1;
for i:=1 to n-1 do
 begin
   new(p2);
   p2^.inf:=random(10)-1;
   p2^.next:=nil;
   p2^.next:=first;
   first:=p2;
 end;

t:=p2;
while t<>nil do
  begin
    write(t^.inf,' ');
    t:=t^.next;
  end;


while p1^.next<>nil do p1:=p1^.next;
p1^.next:=p2;
p1:=beg;
writeln;
t:=p1;
while t<>nil do
  begin
    write(t^.inf,' ');
    t:=t^.next;
  end;

readln;
  end.


я сделал так.. вроде работает.. я понял свою ошибку...
всем кто помогал спасибо)) особенно volvo.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.